From 8db5b0868ff273fdf3803ea26f67aea80d1e0131 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sat, 26 Nov 2016 14:43:24 +0100 Subject: [PATCH] Scale point size to match camera distance, base point size on particle mass --- computenbody/computenbody.cpp | 6 ++++-- data/shaders/computenbody/particle.vert | 13 +++++++++++-- data/shaders/computenbody/particle.vert.spv | Bin 1468 -> 2304 bytes 3 files changed, 15 insertions(+), 4 deletions(-) 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 5a113e4ed411558bc1c413cf0d74028baf189871..b3da09be445ce4afb1603b3be05a0c8fe5fd6381 100644 GIT binary patch literal 2304 zcmZ9N+foxj5QY~>0FQ`>;0Y7(jG`baiV6WWs8LSBZ7PtdxEeOpX7O~zjaAco64oXf)mL)5a4t?6S|CB>U{9>tGSeYv~-F79cM6TR? zTdBIR+}L>MHlyah93A;Vtz54JwVg`Ml_w`|ZC5tmds*F-j+s@i-HK7GmzP|)?!w4@ zk}0%>qjT11`jOuVgm%Sz-Voz{5Uu)O9K5XZE{t(%-q?wXq3Y&>D9I-i_rVX=U0vr3Vp1#Cq1LvCkq;PqQ8D3> zOEG!#kaX69Y6-DgG;T3lAggqIOEQocFyS&Ibr7| zV4M#pIzE=uMd>WFuSjo8*`w0&w;GH|_q^R1Y-&6a+xzEtTK3-gtZa*4NOXJiqHOA6 zHKYg34VcxGxgnpsdNcP>4;Gx?LYQl~%zLlI?xLRjok-i`iCvHvv3exT40G{VH)1mr zoYS8{2|cB6j}(KvPf5VPii3Sx!d!rJ2RVRo2lXD286vsS?!Uri8ok<&1uQSFW7#4~N{~@D}O^W^cJI zowv|)d&{JBaEo_WIyJER+>_2sfE#B@dYW@T;eZp1UOtczKmC^J1UJsZgp=;iBVpk7 z-pA6(ff)F6ZttCuPX2IsFY^IbP-mIdISKEbm85$!FPk&V9)10TW!L1I@q~ix} zensi{rSo5q4gM{eujkV71;>xMeIZHDEjB#PnYove|NB%*aC$(mUrDI1)#9~uIN;o~ ksC`L79QsXtu;Fpe?_*WM?=zkMn*@iyEFJrge!)|czr(Pb^#A|> literal 1468 zcmY+C*>2N76o!W^ZK2RoN*A``G%Z^pRHz^%#FE~)7m+Ab^wx5lQ81)-0y>Zw+mv&Nj$Z_Ye6|kFt|b z_OuxO&(T$q_M(2A_C|5fMte_o2l44=Q&*aCnjyN6B{!udaTXfkR$q$woz(s~4LV$^l+;^CjuA?K@u8T$lc^|JK#S z<_z+TsVF(Ysd<)lZU0MRzsjcGP3h4|=JK+$Bz0xXfe_~6%#YOsBM%rlR1SFTIaF`- zydmM>^DXe<9?19o)tz6T_)Ym7>UxeIh|A~W$T1y0g}k$$d$p(!~&;G%vw=5kgW zvo8KMX>$8{*)14C{TtHk37q=)>==yuTcr)3{WYbj