diff --git a/computenbody/computenbody.cpp b/computenbody/computenbody.cpp index a2415a73..24e41df3 100644 --- a/computenbody/computenbody.cpp +++ b/computenbody/computenbody.cpp @@ -27,7 +27,7 @@ // Lower particle count on Android for performance reasons #define PARTICLES_PER_ATTRACTOR 2 * 1024 #else -#define PARTICLES_PER_ATTRACTOR 8 * 1024 +#define PARTICLES_PER_ATTRACTOR 4 * 1024 #endif class VulkanExample : public VulkanExampleBase @@ -56,6 +56,7 @@ public: struct { glm::mat4 projection; glm::mat4 view; + glm::vec2 screenDim; } ubo; } graphics; @@ -371,7 +372,7 @@ public: vkTools::initializers::vertexInputAttributeDescription( VERTEX_BUFFER_BIND_ID, 0, - VK_FORMAT_R32G32B32_SFLOAT, + VK_FORMAT_R32G32B32A32_SFLOAT, offsetof(Particle, pos)); // Location 1 : Velocity (used for gradient lookup) vertices.attributeDescriptions[1] = @@ -703,6 +704,7 @@ public: { graphics.ubo.projection = camera.matrices.perspective; graphics.ubo.view = camera.matrices.view; + graphics.ubo.screenDim = glm::vec2((float)width, (float)height); memcpy(graphics.uniformBuffer.mapped, &graphics.ubo, sizeof(graphics.ubo)); } diff --git a/data/shaders/computenbody/particle.vert b/data/shaders/computenbody/particle.vert index d16b4ae1..4bdeb92e 100644 --- a/data/shaders/computenbody/particle.vert +++ b/data/shaders/computenbody/particle.vert @@ -3,7 +3,7 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable -layout (location = 0) in vec3 inPos; +layout (location = 0) in vec4 inPos; layout (location = 1) in vec4 inVel; layout (location = 0) out float outGradientPos; @@ -12,6 +12,7 @@ layout (binding = 2) uniform UBO { mat4 projection; mat4 modelview; + vec2 screendim; } ubo; out gl_PerVertex @@ -23,6 +24,14 @@ out gl_PerVertex void main () { gl_PointSize = 8.0; + + const float spriteSize = 0.005 * inPos.w; // Point size influenced by mass (stored in inPos.w); + + vec4 eyePos = ubo.modelview * vec4(inPos.x, inPos.y, inPos.z, 1.0); + vec4 projectedCorner = ubo.projection * vec4(0.5 * spriteSize, 0.5 * spriteSize, eyePos.z, eyePos.w); + gl_PointSize = ubo.screendim.x * projectedCorner.x / projectedCorner.w; + + gl_Position = ubo.projection * eyePos; + outGradientPos = inVel.w; - gl_Position = ubo.projection * ubo.modelview * vec4(inPos, 1.0); } \ No newline at end of file diff --git a/data/shaders/computenbody/particle.vert.spv b/data/shaders/computenbody/particle.vert.spv index 5a113e4e..b3da09be 100644 Binary files a/data/shaders/computenbody/particle.vert.spv and b/data/shaders/computenbody/particle.vert.spv differ