From e74e37cc16425e76b84316f324820d4909cfc5ba Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sat, 13 Aug 2016 16:37:53 +0200 Subject: [PATCH] Color gradient ramp for glowing parts of the mesh --- data/shaders/radialblur/colorpass.frag | 13 ++++- data/shaders/radialblur/colorpass.frag.spv | Bin 520 -> 1424 bytes data/shaders/radialblur/colorpass.vert | 7 ++- data/shaders/radialblur/colorpass.vert.spv | Bin 1188 -> 1524 bytes data/shaders/radialblur/phongpass.frag | 5 +- data/shaders/radialblur/phongpass.frag.spv | Bin 2480 -> 2772 bytes data/shaders/radialblur/phongpass.vert | 3 + data/shaders/radialblur/phongpass.vert.spv | Bin 1896 -> 2128 bytes data/shaders/radialblur/radialblur.frag | 2 +- data/shaders/radialblur/radialblur.frag.spv | Bin 2496 -> 2496 bytes radialblur/radialblur.cpp | 58 +++++++++++++------- 11 files changed, 64 insertions(+), 24 deletions(-) diff --git a/data/shaders/radialblur/colorpass.frag b/data/shaders/radialblur/colorpass.frag index b23b0129..d4d8a25e 100644 --- a/data/shaders/radialblur/colorpass.frag +++ b/data/shaders/radialblur/colorpass.frag @@ -3,11 +3,22 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable +layout (binding = 1) uniform sampler2D samplerGradientRamp; + layout (location = 0) in vec3 inColor; +layout (location = 1) in vec2 inUV; layout (location = 0) out vec4 outFragColor; void main() { - outFragColor.rgb = inColor; + // Use max. color channel value to detect bright glow emitters + if ((inColor.r >= 0.9) || (inColor.g >= 0.9) || (inColor.b >= 0.9)) + { + outFragColor.rgb = texture(samplerGradientRamp, inUV).rgb; + } + else + { + outFragColor.rgb = inColor; + } } \ No newline at end of file diff --git a/data/shaders/radialblur/colorpass.frag.spv b/data/shaders/radialblur/colorpass.frag.spv index 7fad085dbc6b361978c60ddb7364518ed34fb629..bf3e9bccb789e355ace0d02a10d17f705fa89c7a 100644 GIT binary patch literal 1424 zcmZ{j+fGwa5QdjP5k)!3NyI}7o>4>uBr$4`#NIR^!Kjzb7B;n7+NLe<5xjPi)SGUc$8KY5*c4p%XhJkhaR z?{z1s^+EOvD7ugDCMWGi+9`LapEi33q*+b1*PCzO;X*mDdEJC%?)MGm)>?Lx<-U0d zb4KRYlW#u56r4jTn@GswS$;>s=E0m*5nJHg7`{I{F{jqAA^t4S{a)+Nk&okxm}@o9 zFZ9#w{6%89)^uM#g&iLszl{7jayc=-Myy`-+{AmvnXBg(-q#?m9&=|Swust0c=^^F zTrppQd6x}&*1MOJ#H?rTEM4}0fVZA{STR*A-&-)pZr`QkVD=CZ;aqsLOY$F7G+&xM*va_q~dF*XG{mBh0&e&zJhX)-gHa`}}A4 zKkyh6*IeGacWw>OY+$~}ecqz^lN|G$@4^{6Q{To5e&xz>_UcxnTCHclEzDWP`rE{V V^`DZ9$@^b@IfM1>^9SWS*k8q{W|;s0 literal 520 zcmY+A-Acni6oilc*J@i4^iC??mm*aPqM(Ag2?+WCVQoW<)}$oq3;I;v2+p@{K{uS7 zo!QwllhkYHZL=Lc9UIts9a>G;tZOabgYYFBmDPMSxg4YDS=|fK^sQ|Tb?Vcl83((n zebqoZco}F{*Hp7FU1~@XgwfseeN@IvSGX#U$~QNUizt76k7rf+U!$WmOQMC#l9fy1 zXmT-Ly4i;{HR-Q!Q+e^uSJh+Tl81be7lK|#o-|uiflpv|%AppR^DRD7QnH@;)aLic z+PB0FRVUK(O{b9G@Gdt1 diff --git a/data/shaders/radialblur/colorpass.vert b/data/shaders/radialblur/colorpass.vert index abd9082e..bd8a9ce2 100644 --- a/data/shaders/radialblur/colorpass.vert +++ b/data/shaders/radialblur/colorpass.vert @@ -3,16 +3,18 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable -layout (location = 0) in vec4 inPos; +layout (location = 0) in vec3 inPos; layout (location = 2) in vec3 inColor; layout (binding = 0) uniform UBO { mat4 projection; mat4 model; + float gradientPos; } ubo; layout (location = 0) out vec3 outColor; +layout (location = 1) out vec2 outUV; out gl_PerVertex { @@ -22,5 +24,6 @@ out gl_PerVertex void main() { outColor = inColor; - gl_Position = ubo.projection * ubo.model * inPos; + outUV = vec2(ubo.gradientPos, 0.0f); + gl_Position = ubo.projection * ubo.model * vec4(inPos, 1.0); } diff --git a/data/shaders/radialblur/colorpass.vert.spv b/data/shaders/radialblur/colorpass.vert.spv index 2cce8d4a03dfa0df427edc81911c4295cfd4933e..7e40062779c51bec629ec17a76916c8f327687d6 100644 GIT binary patch literal 1524 zcmY+C+iuf95QdjH357ySDLrsXorZHE1XK_b;?Q!DUPK~*+FQ$QtYAp($aW+y`wH+# zJQX)c{NLIu+KnbN^UpuCGqd(;o%6<=({Ii^Gv!$_HTlNOo2J$M!IwcdFGk(%7d;pY z#-s+q;{@k|WL~l;X-V!&JpF3Yzm-%Mqdy3CKJNy3G!3(`h=TlUIEu0$ zJ^U6O75Q0?LUA$l(oCl1&`X?@5IOWE z&i;Xod*-V2{_aOj+qAY^GtE*uiBnC~R24YPdz_APOuQBn-kTujeg6E-_c zWjD<&;*($)Wd~7KL_g%(TyPGtG>`2?;^f&I@b>(dLo6G>n5aHs2!y=+Q2^o!rN zURl%agt<86gSmY6;pSf!3f>lnuMvAyR#V!Stf@Y|;S=}e&s8?~>&j=RF3y+iW+IMH zFJRQWEKNP`qTYfux!~~ec>^%`>=QoU=(_%wq`~l8)q8*;W#4tPESvi5jhguE32a6F zinK4Gr>)9gmF;?3t8D5KN8gZeTI!5_(gXe9mZn!Q?!srkV6OItYz};1ntSNi#XGX; z#qEnX!gqH+lx@t(JMy2(qBi%x)cn+97aZ_ELipz12<43~N!b5eMR_Ou9Wj`3UBX_N z9X@kjmw*q&;Z1H<81qwuw*jMuFWr_Vb$GIaL4s$xrUD@EjREL~<67s-Z z?+;|Ni%;Uv+an1W$6;Ht!Pu9>9#WPGW_{7=iPt_&Xm2f{CdS=Hx3Gc{U N%#9E4uWouJ`3EWXV;cYf literal 1188 zcmY+CT~8B16o$vPTT#9Q9zU-EHFE(4XY5 z^2WsXncYe1G^gjh@A;fF+idin8uLWIIdf>Lvtk;;#>|_x*Zslu;J7G<$ER;kh*&aB zA4trydFJhw{vVSx1HjBnUP$&OP5m0uzm?FEw?Bx_zMjX0og{fu+PL_Z3~e5}yYKeC zEdGy?E6qmnILSuSWMt#hHz$+i{=r15G}|*0Lti&7zqql>W%?NANVAHHbe|>R(Kx=c z`K`@M`-8Z4&12(pMOvmVQ-0Im0UrCM^v(IDkH_Xra>vw!i;sK^dwFz2JC-JILwb7W zWVif2(o8MH_5C)C*^|uyGcTBZT_}TjIq;mm>cLh1mhT52Nr(?~^&oX-IX$$$&xQIB z$DFfyVDdgoLLOYmqc?f)TXAmIeut)R!eeYo42vdHVI244^MhOD-9N3yAU^a11V z2+!3v{D&Iz#=-wwc9;)8m_5N!Z&8|hd?$O#VsCKNUY4c~9Jye=SGaZI73q$IT1Pcr zmCe}_UX!L)RlC|J976qdY3|6rs1IgeaQHWCoA^+FTQ>dhvo~ydkPl{`!G9o|S@FNq zD^izPIPibO@U|btvcClhyZIz9I|QF8f;qM%%*OqQXQo#Y_z?42HZjZ?Vs>Q1|56=t nb|vJ&6I1QFn)|0>z+DM(9SOC$M^D1;>Cb#%;{NKk?= 0.9) || (inColor.g >= 0.9) || (inColor.b >= 0.9)) { - outFragColor.rgb = inColor; + outFragColor.rgb = texture(samplerGradientRamp, inUV).rgb; } else { diff --git a/data/shaders/radialblur/phongpass.frag.spv b/data/shaders/radialblur/phongpass.frag.spv index f0d494cd170d6dc53822c17e8ca95d8e93fdd0ab..cd300965359fc612e50e26a8a4b40a1fa6aec6f7 100644 GIT binary patch literal 2772 zcmZ9MS$9)q6owC-M5zoii8!=W5dmw(f+)}dN>eb>(n3)j!fAVw2GXP}NiV!oFTC~2 zAK|a?!fX9GE{C;Ti|0wsrqQqK?cV$S-m~}qru6rXJ(nbV_}iN_lI}Q^^bse?zGSFl z3&oY9# zgJkOM!`NP`^&5>^qsjbGr?19Nd%l@gx+L?1baWQmO1HLaS+me2e^zfV6LxaCj%xk> zDu%c}xrDv>O@=?%SzonIwA7$W=LeH3*yXHTqw{Pd=iGy8y;!YmwpX+DuFgHF*6%c$ zTWJlq^X(k=*6h}r4FtC!H&-o}cUoC+%Q&s=Y<;JeHiNsTZe^D&q4|l`P_b=kBHK+61gP>e4Plx^}v6_fq!?$1i zc@yh5uG@az!n#Iz`!RMem3oFM0th@b>@2~7s;8=*t2k0|2)=w_M`q? zthwaX8+$f#&R@i;@7*uY%K6wo&#E`}tm69{_8UoJW6#1 zpeEpaXm8;&o@s9r$n_$$cT_T5$6c&_h?rl&r|wkLy-(Der?>9Iu6E`UugSgh{2ZRs zUoeAM_rv}29a|@2-)+S1$K3zog`U_xeS^Jv-=Fa;RlI-ufp^w>d5xOR9RTvbpc%p* z$~o`m&uHXc%K1O(`Ut+`ALir_13A~CAGMC*Tgy8gwT|P_g2dFbV8K-`>Exe{e*5S=lZeHV;$d|=I|Re?xpX@ Ox!!j)M*J^TE`z6Z2hFem literal 2480 zcmZ9MNpl-j6oossWkO;ykck-wGbb1moDfJN+ldn;K_re1VMb}oEkz(pE=gXn0v2pp z@gw*ZELg+Op%|*D;``Knp`l$@@7(iFzkA;8_dGc<_dt^D;cst}CHZqWnIKP+{mJxr ztkpN_^TW~B{NmXK6$g^Zu~5yyWM4AHXl$pQo)i0s=ZRN{GsIcq5bvm=7-*6TN%9j5 zOeGH{wR&S^{c>ZN?WBWrlr@I;)2(dK=x=_WHAln$YMAQu+Kq17YwxD*tg(1zVJB^V zkyKcz?7>_go!*sxw?ANhdhDscJGwSV+d0X61uv%=uYQ?8TiPOsi+-yhx0nz_z>c6zt^gYC2n9KZV(4 zaUE{BlQnm{=^%7B)ouJs)`~qn1#j=o?X$U$xji?xzvlWh_lue9G4w}JsXICTBKbQ< zVW#1Z!}+adi4(lHmofi#a(=bkgZzaex8M3YM!uhMmhd@Mm@et8! zwU$DEj9g9RPlENUpJy3;$8WBm=NR3iynf8>jhyqR7}b~k+AG%&|Mse!+beV5f0NPo zT|fL@0RQrHy&CyN@+A3s=`>1pmk2cx&WCmh%=3?S+2nr_+EsWTebgBBVZ{6mFm?T7vHURWn`??L4D!?Rt^tEIdK_Dq-OJSk791@P4f0_$%(L{V1U)`=s6);p;K5^ZI&%(MMnMj}vnG5{EDEqP{%a z;p=IzeE6CL%Z0C4$1!}J1Y29LvxGJDF~{hm4>ivaFBAF@Thlx70-+Cc&+dza_vbb@ z-TbA3Q|Fm+|MtWCRpnQ$8vABV*SAirKM(f4eO1(Z6)ZQyD%M{h_7GPI=UmhCCm(CP z4)%`58jE1Lm_G;h&d%_yT=NaWHEV=g=cC?vaMV+0J;3gQ?aBKZf2;W!l{6*s1qV}g?>#GUB zpMl*&_-laG$w!@gV0oY5Qm|av&t}2tCv?q%n`8`+Ti|?AM#<=Oz7;ixRw7Bt^-jga9j&jDEe^ej2qFuyRoA#TCce`i}PT1o<4Iw7Uy}}-S=NfZTdB=Q=BU*1~&RN zX?g7h$*9g#J2w7;?7mb7UrKFeV*U%#?auhIsTIul%m}{unGt^S(O>dW3;Bk$!v%+r z%?!cd4{L|dJje8ZRXZ5=csfroB)L~scTD2bcVc4GXL63n9@AcsP}5{;Uzct*-AHxf z;b*@sVU4RY=0OeAU(imiVC2FsO291kgmf1Cl6LY?ulesw?~&ktoa)3U9yT*K|Fm>s zo1b~{2EaJ~QaiK5Z?!K;ckahevtP&d>FSi2@RlXq4}puH+{ETR5qm+srf&Mq0{bn5 z?*lG*`Nqk;ESr5m!rNF8n>U1QzCr1{3w*p6>~%$>_ctZXiHc zCWd|Y#3%{7E3t2l81(yIiW}!a%Axk%V*LaOl^RgqeI32m6Tx9yqa? z(NjrL!tALJ8=mEUCY}1abI-~Kw>;0KcjuXt4F~+4^3a!g2{_BJ1?gbC8N*(r7&ENu zB=cF6a2`H>>f|kfqccz5hSjqw9c)K0gY#<=FoZ=u;v0WmI`tcWLpm73GX7WHg?O8i ZH3__dw8l5m;cZFqQx|U%{Es|~lD}zBjPd{g literal 1896 zcmZ9L-%b-j6vhYIttbd0^2dKzsEP_AAXF3)!H{~<2x{bZv(QahE!}3jBzkA!6X+B8 zD8{Gq#>DS8yJM=;9OiuA`OcZMXNE$5<%}_X`VE*(ldVzHFKo=9DcQYNe_LPdrj5nb zwIvk8reK9=M$CEZ7xnifh}wX&vOyVU;Y!=tqOuSTJ$-Sk^QyLlQkLw|K;sS_N1FrF&)_TY)3kN7lw6(=V_ zOFkTZMeV*to7jY|27*WJPXV`z}zU9S%B#U%>9A6ua~OI99ZPBYRZJm z;zj!%@SY64``!wqRxhWAXD(PS%j3-6JTQ6BWiAiS<#9IkIh$UY*Q|`?@Jt3RCf57y zyhrzK=$RLoS&XSFb!UXY_!II<+RL&@>FEPZyevGB`|uk%<_)^|Ir*-C;$Y?o=k&}U zy^Aw{;+)5NzSxbP+IWf`^Rb387eH6=WuomyG#>^|Ty z>Q8BB2F#oKVCD@+{7UYlclEE!=RD#wxz8EogJ*M&_$~SL>f+3j`++0Aq@B4Er#^F7 zk+B?pXwml{4zF7Ld22zL_sX&b%-h_}4mzds>je zvmAF{K3rc9x0rLxe_xr*_JNFi^u+0NPCGn4cfq~7ejdq(+taO*zb=ErSe!?Fr++M; o{+<4bd^n8d^k4KX)Z36z6WvhW<5T(Qc4frri}wWoTak6yAL4a=BLDyZ diff --git a/data/shaders/radialblur/radialblur.frag b/data/shaders/radialblur/radialblur.frag index 27ca176a..e1bfae5b 100644 --- a/data/shaders/radialblur/radialblur.frag +++ b/data/shaders/radialblur/radialblur.frag @@ -26,7 +26,7 @@ void main() vec4 color = vec4(0.0, 0.0, 0.0, 0.0); UV += radialSize * 0.5 - ubo.radialOrigin; - #define samples 16 + #define samples 32 for (int i = 0; i < samples; i++) { diff --git a/data/shaders/radialblur/radialblur.frag.spv b/data/shaders/radialblur/radialblur.frag.spv index b348e565284ab16b664543aa509abd67a311d2d0..f1c85ca5b35f1dd9c0324e1825511a48ec9204bd 100644 GIT binary patch delta 26 icmX>gd_Z_Z3k##dgd_Z_Z3k##b bindingDescriptions; @@ -59,18 +63,14 @@ public: vkTools::UniformData fsQuad; } uniformData; - struct { + struct UboVS { glm::mat4 projection; glm::mat4 model; - } uboVS; + float gradientPos = 0.0f; + } uboSceneVS, uboQuadVS; - struct { - glm::mat4 projection; - glm::mat4 model; - } uboQuadVS; - - struct { - float radialBlurScale = 0.25f; + struct UboQuadFS { + float radialBlurScale = 0.35f; float radialBlurStrength = 0.75f; glm::vec2 radialOrigin = glm::vec2(0.5f, 0.5f); } uboQuadFS; @@ -165,6 +165,8 @@ public: vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); + + textureLoader->destroyTexture(textures.gradient); } // Setup the offscreen framebuffer for rendering the blurred scene @@ -457,6 +459,7 @@ public: void loadAssets() { loadMesh(getAssetPath() + "models/glowsphere.dae", &meshes.example, vertexLayout, 0.05f); + textureLoader->loadTexture(getAssetPath() + "textures/particle_gradient_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, &textures.gradient, false); } // Setup vertices for a single uv-mapped quad @@ -552,7 +555,7 @@ public: std::vector poolSizes = { vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4), - vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2) + vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6) }; VkDescriptorPoolCreateInfo descriptorPoolInfo = @@ -649,7 +652,14 @@ public: descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsQuad.descriptor) + &uniformData.vsQuad.descriptor), + // Binding 1 : Color gradient sampler + vkTools::initializers::writeDescriptorSet( + descriptorSets.scene, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + 1, + &textures.gradient.descriptor) + }; vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); } @@ -765,8 +775,8 @@ public: createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, + sizeof(uboSceneVS), + &uboSceneVS, &uniformData.vsScene.buffer, &uniformData.vsScene.memory, &uniformData.vsScene.descriptor); @@ -775,8 +785,8 @@ public: createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, + sizeof(uboQuadVS), + &uboQuadVS, &uniformData.vsQuad.buffer, &uniformData.vsQuad.memory, &uniformData.vsQuad.descriptor); @@ -808,6 +818,11 @@ public: uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(timer * 360.0f), glm::vec3(0.0f, 1.0f, 0.0f)); uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + if (!paused) + { + uboQuadVS.gradientPos += frameTimer * 0.1f; + } + uint8_t *pData; VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData)); memcpy(pData, &uboQuadVS, sizeof(uboQuadVS)); @@ -818,14 +833,19 @@ public: void updateUniformBuffersScreen() { // Vertex shader - uboVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); - uboVS.model = glm::mat4(); + uboSceneVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); + uboSceneVS.model = glm::mat4(); uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboSceneVS), 0, (void **)&pData)); + memcpy(pData, &uboSceneVS, sizeof(uboSceneVS)); vkUnmapMemory(device, uniformData.vsScene.memory); + if (!paused) + { + uboSceneVS.gradientPos += uboQuadVS.gradientPos; + } + // Fragment shader VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData)); memcpy(pData, &uboQuadFS, sizeof(uboQuadFS));