Skip to content
Snippets Groups Projects
Verified Commit 76a7e73c authored by Tobias Frisch's avatar Tobias Frisch
Browse files

Normalized weights via calculated sum of weights

parent fb3e188d
No related branches found
No related tags found
1 merge request!103Added project wobble_bobble and refactored some parts of the framework
......@@ -38,7 +38,7 @@ void main() {
float mass = gridData.w;
float density = mass / sphere_volume(size);
float alpha = clamp(density / 100000000.0f, 0.0f, 1.0f);
float alpha = clamp(density / 10000.0f, 0.0f, 1.0f);
passPos = vertexPos;
passVelocity = gridData.xyz;
......
......@@ -16,12 +16,16 @@ void main() {
if (gl_GlobalInvocationID.x < particles.length()) {
ParticleMinimal minimal = particles[gl_GlobalInvocationID.x].minimal;
minimal.weight_sum = 1.0f;
barrier();
memoryBarrierBuffer();
ivec3 gridResolution = textureSize(sampler3D(gridImage, gridSampler), 0);
ivec3 gridWindow = ivec3(minimal.size * 2.0f * gridResolution);
float volume = sphere_volume(minimal.size);
float weight_sum = 0.0f;
float mass = 0.0f;
int i, j, k;
barrier();
......@@ -33,9 +37,7 @@ void main() {
vec3 offset = vec3(i, j, k) / gridResolution;
vec3 voxel = minimal.position + offset;
vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
mass += gridSample.w * voxel_particle_weight(voxel, minimal);
weight_sum += voxel_particle_weight(voxel, minimal);
}
}
}
......@@ -43,17 +45,8 @@ void main() {
barrier();
memoryBarrierBuffer();
if (volume > 0.0f) {
float density = minimal.mass / volume;
//volume = minimal.mass / (mass / volume);
//mass = density * volume;
if (weight_sum > 0.0f) {
particles[gl_GlobalInvocationID.x].minimal.weight_sum = weight_sum;
}
barrier();
memoryBarrierBuffer();
particles[gl_GlobalInvocationID.x].minimal.size = sphere_radius(volume);
particles[gl_GlobalInvocationID.x].minimal.mass = mass;
}
}
\ No newline at end of file
......@@ -6,6 +6,9 @@ struct ParticleMinimal {
float size;
vec3 velocity;
float mass;
vec3 pad;
float weight_sum;
};
struct Particle {
......@@ -64,7 +67,9 @@ float voxel_particle_weight(vec3 voxel, ParticleMinimal particle) {
weight_C(delta.z)
);
return weight.x * weight.y * weight.z;
return (
weight.x * weight.y * weight.z
) / particle.weight_sum;
}
float grad_weight_A(float x) {
......@@ -119,7 +124,7 @@ vec3 voxel_particle_grad_weight(vec3 voxel, ParticleMinimal particle) {
grad_weight.x * weight.y * weight.z,
grad_weight.y * weight.z * weight.x,
grad_weight.z * weight.x * weight.y
);
) / particle.weight_sum;
}
#endif // PARTICLE_INC
\ No newline at end of file
......@@ -11,6 +11,10 @@ struct Particle {
float size;
glm::vec3 velocity;
float mass;
glm::vec3 pad;
float weight_sum;
glm::mat4 deformation;
};
......@@ -72,6 +76,9 @@ void distributeParticles(Particle *particles, size_t count, const glm::vec3& cen
for (size_t i = 0; i < count; i++) {
particles[i].mass = (mass * sphere_volume(particles[i].size) / volume);
particles[i].deformation = glm::mat4(1.0f);
particles[i].pad = glm::vec3(0.0f);
particles[i].weight_sum = 1.0f;
}
}
......@@ -214,33 +221,33 @@ int main(int argc, const char **argv) {
vkcv::shader::GLSLCompiler compiler;
std::vector<vkcv::DescriptorSetHandle> transformParticlesToGridSets;
vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline(
std::vector<vkcv::DescriptorSetHandle> initParticleWeightsSets;
vkcv::ComputePipelineHandle initParticleWeightsPipeline = createComputePipeline(
core, compiler,
"shaders/transform_particles_to_grid.comp",
transformParticlesToGridSets
"shaders/init_particle_weights.comp",
initParticleWeightsSets
);
{
vkcv::DescriptorWrites writes;
writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(1, gridCopy.getHandle()));
core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, gridCopy.getHandle()));
writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
core.writeDescriptorSet(initParticleWeightsSets[0], writes);
}
std::vector<vkcv::DescriptorSetHandle> initParticleVolumesSets;
vkcv::ComputePipelineHandle initParticleVolumesPipeline = createComputePipeline(
std::vector<vkcv::DescriptorSetHandle> transformParticlesToGridSets;
vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline(
core, compiler,
"shaders/init_particle_volumes.comp",
initParticleVolumesSets
"shaders/transform_particles_to_grid.comp",
transformParticlesToGridSets
);
{
vkcv::DescriptorWrites writes;
writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, gridCopy.getHandle()));
writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
core.writeDescriptorSet(initParticleVolumesSets[0], writes);
writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(1, gridCopy.getHandle()));
core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
}
std::vector<vkcv::DescriptorSetHandle> updateGridForcesSets;
......@@ -547,7 +554,6 @@ int main(int argc, const char **argv) {
1
));
bool initializedParticleVolumes = false;
bool renderGrid = true;
// Glass is glass and glass breaks...
......@@ -619,6 +625,23 @@ int main(int argc, const char **argv) {
const uint32_t dispatchSizeGrid [3] = { 16, 16, 16 };
const uint32_t dispatchSizeParticles [3] = { static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1 };
core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", { 0.78f, 0.89f, 0.94f, 1.0f });
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.prepareImageForSampling(cmdStream, grid.getHandle());
core.recordComputeDispatchToCmdStream(
cmdStream,
initParticleWeightsPipeline,
dispatchSizeParticles,
{ vkcv::DescriptorSetUsage(
0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
) },
vkcv::PushConstants(0)
);
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.recordEndDebugLabel(cmdStream);
core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f });
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.prepareImageForStorage(cmdStream, gridCopy.getHandle());
......@@ -636,27 +659,6 @@ int main(int argc, const char **argv) {
core.recordImageMemoryBarrier(cmdStream, gridCopy.getHandle());
core.recordEndDebugLabel(cmdStream);
if (!initializedParticleVolumes) {
core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE VOLUMES", { 0.78f, 0.89f, 0.94f, 1.0f });
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.prepareImageForSampling(cmdStream, gridCopy.getHandle());
core.recordComputeDispatchToCmdStream(
cmdStream,
initParticleVolumesPipeline,
dispatchSizeParticles,
{ vkcv::DescriptorSetUsage(
0, core.getDescriptorSet(initParticleVolumesSets[0]).vulkanHandle
) },
vkcv::PushConstants(0)
);
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.recordEndDebugLabel(cmdStream);
initializedParticleVolumes = true;
}
core.recordBeginDebugLabel(cmdStream, "UPDATE GRID FORCES", { 0.47f, 0.77f, 0.85f, 1.0f });
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
core.prepareImageForStorage(cmdStream, grid.getHandle());
......@@ -834,7 +836,6 @@ int main(int argc, const char **argv) {
ImGui::SameLine(0.0f, 10.0f);
if (ImGui::Button("Reset##particle_velocity")) {
resetParticles(particles, initialVelocity, density, radius);
initializedParticleVolumes = false;
}
ImGui::End();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment