From 028f4c5ff81ab7e10d611f86c269a3b8d1a8adb2 Mon Sep 17 00:00:00 2001 From: TheJackiMonster <thejackimonster@gmail.com> Date: Fri, 22 Jul 2022 10:30:16 +0200 Subject: [PATCH] Fixed directional issues with smoke Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> --- projects/fire_works/shaders/smoke.frag | 11 ++------- projects/fire_works/shaders/smoke.vert | 12 +++++----- projects/fire_works/shaders/trail.geom | 33 ++++++++++++-------------- projects/fire_works/src/main.cpp | 16 +++++++++---- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/projects/fire_works/shaders/smoke.frag b/projects/fire_works/shaders/smoke.frag index 7339c6ee..ac5740d8 100644 --- a/projects/fire_works/shaders/smoke.frag +++ b/projects/fire_works/shaders/smoke.frag @@ -5,7 +5,7 @@ #include "physics.inc" layout(location = 0) in vec3 passPos; -layout(location = 1) in vec3 passView; +layout(location = 1) in vec3 passDir; layout(location = 2) in vec3 passColor; layout(location = 3) in float passDensity; layout(location = 4) in flat int passSmokeIndex; @@ -16,11 +16,6 @@ layout(set=1, binding=0, std430) readonly buffer randomBuffer { float randomData []; }; -layout( push_constant ) uniform constants{ - mat4 view; - mat4 projection; -}; - #define NUM_SMOKE_SAMPLES 16 void main() { @@ -28,10 +23,8 @@ void main() { discard; } - vec3 dir = -normalize((inverse(view) * vec4(passView, 0)).xyz); - vec3 start = passPos; - vec3 end = start + dir * 3.5f; + vec3 end = start + normalize(passDir) * 3.5f; vec4 result = vec4(0); diff --git a/projects/fire_works/shaders/smoke.vert b/projects/fire_works/shaders/smoke.vert index aa17b3d6..0392deca 100644 --- a/projects/fire_works/shaders/smoke.vert +++ b/projects/fire_works/shaders/smoke.vert @@ -10,14 +10,14 @@ layout(set=0, binding=0, std430) readonly buffer smokeBuffer { layout(location = 0) in vec3 vertexPos; layout(location = 0) out vec3 passPos; -layout(location = 1) out vec3 passView; +layout(location = 1) out vec3 passDir; layout(location = 2) out vec3 passColor; layout(location = 3) out float passDensity; layout(location = 4) out flat int passSmokeIndex; layout( push_constant ) uniform constants{ - mat4 view; - mat4 projection; + mat4 mvp; + vec3 camera; }; void main() { @@ -25,10 +25,10 @@ void main() { float size = smokes[gl_InstanceIndex].size; vec3 color = smokes[gl_InstanceIndex].color; - vec4 viewPos = view * vec4(position + vertexPos * size, 1); + vec3 pos = position + vertexPos * size; passPos = vertexPos; - passView = viewPos.xyz; + passDir = pos - camera; passColor = color; if (size > 0.0f) { @@ -40,5 +40,5 @@ void main() { passSmokeIndex = gl_InstanceIndex; // transform position into projected view space - gl_Position = projection * viewPos; + gl_Position = mvp * vec4(pos, 1); } \ No newline at end of file diff --git a/projects/fire_works/shaders/trail.geom b/projects/fire_works/shaders/trail.geom index e1d37e9b..864b302d 100644 --- a/projects/fire_works/shaders/trail.geom +++ b/projects/fire_works/shaders/trail.geom @@ -22,14 +22,14 @@ layout(location = 3) in uint geomStartIndex [1]; layout(location = 4) in uint geomUseCount [1]; layout(location = 0) out vec3 passPos; -layout(location = 1) out vec3 passView; +layout(location = 1) out vec3 passDir; layout(location = 2) out vec3 passColor; layout(location = 3) out float passDensity; layout(location = 4) out flat int passSmokeIndex; layout( push_constant ) uniform constants{ - mat4 view; - mat4 projection; + mat4 mvp; + vec3 camera; }; void main() { @@ -54,7 +54,7 @@ void main() { return; } - vec4 viewPositions [2]; + vec3 positions [2]; uint viewIndex = instanceIndex; if (viewIndex > startIndex) { @@ -63,13 +63,12 @@ void main() { for (uint i = 0; i < 2; i++) { const uint index = (viewIndex + i) % points.length(); - const vec3 position = points[index].position; - viewPositions[i] = view * vec4(position, 1); + positions[i] = points[index].position; } - vec3 pos = viewPositions[0].xyz; - vec3 dir = normalize(cross(viewPositions[1].xyz - pos, viewPositions[0].xyz)); + vec3 pos = positions[0]; + vec3 dir = normalize(cross(positions[1] - pos, pos - camera)); const float trailFactor = mediumDensity / friction; @@ -81,35 +80,33 @@ void main() { const vec3 position = points[index].position; const float size = points[index].size; - vec4 viewPos = view * vec4(position, 1); - if (i > 0) { - dir = normalize(cross(viewPos.xyz - pos, viewPos.xyz)); - pos = viewPos.xyz; + dir = normalize(cross(position - pos, pos - camera)); + pos = position; } vec3 offset = dir * size; float density = trailFactor * (1.0f - u * u) / size; - vec4 v0 = viewPos - vec4(offset, 0); - vec4 v1 = viewPos + vec4(offset, 0); + const vec3 p0 = position - offset; + const vec3 p1 = position + offset; passPos = vec3(u, -1.0f, -1.0f); - passView = v0.xyz; + passDir = vec3(0, 0, 1); passColor = mix(color, trailColor, u); passDensity = density; passSmokeIndex = int(id); - gl_Position = projection * v0; + gl_Position = mvp * vec4(p0, 1); EmitVertex(); passPos = vec3(u, +1.0f, -1.0f); - passView = v1.xyz; + passDir = vec3(0, 0, 1); passColor = mix(color, trailColor, u); passDensity = density; passSmokeIndex = int(id); - gl_Position = projection * v1; + gl_Position = mvp * vec4(p1, 1); EmitVertex(); } diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp index 3d894904..c4de5a7a 100644 --- a/projects/fire_works/src/main.cpp +++ b/projects/fire_works/src/main.cpp @@ -68,6 +68,11 @@ struct draw_particles_t { uint32_t height; }; +struct draw_smoke_t { + glm::mat4 mvp; + glm::vec3 camera; +}; + #define PARTICLE_COUNT (1024) #define SMOKE_COUNT (512) #define TRAIL_COUNT (2048) @@ -838,13 +843,14 @@ int main(int argc, const char **argv) { core.recordBufferMemoryBarrier(cmdStream, smokeBuffer.getHandle()); - glm::mat4 smokeMatrices [2]; - smokeMatrices[0] = camera.getView(); - smokeMatrices[1] = camera.getProjection(); + draw_smoke_t draw_smoke { + camera.getMVP(), + camera.getPosition() + }; core.recordBeginDebugLabel(cmdStream, "Draw smoke", { 1.0f, 0.5f, 1.0f, 1.0f }); - vkcv::PushConstants pushConstantsDraw1 (sizeof(glm::mat4) * 2); - pushConstantsDraw1.appendDrawcall(smokeMatrices); + vkcv::PushConstants pushConstantsDraw1 (sizeof(draw_smoke_t)); + pushConstantsDraw1.appendDrawcall(draw_smoke); core.recordDrawcallsToCmdStream( cmdStream, -- GitLab