From 7f687570d422c33ba1eef984183cdc7a70423cd8 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sun, 17 Jul 2016 18:34:52 +0200 Subject: [PATCH] Added debug display for light source depth maps and shadow toggle --- data/shaders/deferredshadows/debug.frag | 26 ++---- data/shaders/deferredshadows/debug.frag.spv | Bin 2688 -> 1872 bytes data/shaders/deferredshadows/debug.vert | 10 +- data/shaders/deferredshadows/debug.vert.spv | Bin 1508 -> 1908 bytes data/shaders/deferredshadows/deferred.frag | 22 +++-- .../shaders/deferredshadows/deferred.frag.spv | Bin 9008 -> 9180 bytes data/shaders/deferredshadows/deferred.vert | 1 - .../shaders/deferredshadows/deferred.vert.spv | Bin 1392 -> 1308 bytes deferredshadows/deferredshadows.cpp | 87 +++++++----------- 9 files changed, 59 insertions(+), 87 deletions(-) diff --git a/data/shaders/deferredshadows/debug.frag b/data/shaders/deferredshadows/debug.frag index 06a2e090..8ec60922 100644 --- a/data/shaders/deferredshadows/debug.frag +++ b/data/shaders/deferredshadows/debug.frag @@ -14,30 +14,16 @@ layout (location = 0) out vec4 outFragColor; float LinearizeDepth(float depth) { - float n = 1.0; // camera z near - float f = 96.0; // camera z far + float n = 0.1; // camera z near + float f = 64.0; // camera z far float z = depth; return (2.0 * n) / (f + n - z * (f - n)); } void main() { - vec3 components[3]; - components[0] = texture(samplerPosition, inUV.st).rgb; - components[1] = texture(samplerNormal, inUV.st).rgb; - //components[2] = texture(samplerDepth, inUV.st).rgb; - // Uncomment to display specular component - //components[2] = vec3(texture(samplerAlbedo, inUV.st).a); - - // Select component depending on z coordinate of quad - highp int index = int(inUV.z); - if (index == 2) - { - float depth = texture(samplerDepth, vec3(inUV.st, 2.0)).r; - outFragColor = vec4(vec3(1.0-LinearizeDepth(depth)), 1.0); - } - else - { - outFragColor.rgb = components[index]; - } + // Display depth from light's point-of-view + // inUV.w = number of light source + float depth = texture(samplerDepth, vec3(inUV)).r; + outFragColor = vec4(vec3(1.0 - LinearizeDepth(depth)), 0.0); } \ No newline at end of file diff --git a/data/shaders/deferredshadows/debug.frag.spv b/data/shaders/deferredshadows/debug.frag.spv index af44ecc243084235e15b0f5c27a979500da7bb41..39a88b2839f04bb84030ef9f81f636b176b9651c 100644 GIT binary patch literal 1872 zcmZ9MSyNL%5QPUw0*JDRfQVW|TyR4`R*`+lOUgnm^)YoJmk>>IQ#av-CoIba7s@~1XVnXLT9oQ%0A+z6`mN*LSfg0?n$F4x|@ zZ{dvHe{|B^i-Xd3REc7*TU5Z7tMX}`?~c5yw;wgi&2m(;{O$$+DvGN?#p(Ah_|3{e zSd4^oItBW=BV%|>?`enW@3xFVp8H8+`bf?PGhf$b_4Jd>gUNHJ)T6It9!#E>GAI?g ztPq%ZSW!lP+*-=M5#9-0R`t4E4EI%YuX8Y!_gP#xg>)l#~#4T zuE%A?d~e{tIPQgF?unf5N1q=9@6E5hDvlh(b8Cv>l6zctTx*Y=b}t*^n2(-3Z-E|p zGaIsBs<0&EuGj~CGWcCBO2=Jv%ec25d4ErQ6UlkZcQJ|iHiB6TEx$=(bo?IuxeX|$ zJ~`%qeQr=ObHBRYt|{iX3-2{UimB=Guwv$Xc5_A)qk;FD>xx;+<59)Q8aITg;qPip iF&cQ^%T2}9A?J0s6tf<=Z*G0Qo%Buax6TmEdH(_Pm4vzg literal 2688 zcmZ9NYjadZ5QZmYHy18RkedinS4bAsnSOgj~9)?2&t!!qkwvP9ZZ;=V&t>ulGb7!`)l_#OfPUUl}oV1fO z7Fz8*>$aZdH}kFj`l;2kS3(gximxe!u2Ro#v;}LAp;x0lfqqul)i8x#>1=Lw+Iic$ zs=UcNaJ_7EYa{P2b$YFStJ5y__uj4cgD+4;+~wzScRJn8Y@^^Sp^k2~oB0nBe};Zu z*HE|%j{6rk02cfCrk$t#TitB!MrWhb-R3LdI}D%E{#l>r#Qgfka^CEK=XojXK90B& zu3_6pvGpHATw?1l$BT`(kNT~%>=)~=M!)rz_p`2Yyx4fBX&<|~Zw(~YK8Q7ho-CwN z%#pJsSL6JVXv>`j%kM!#`0;we;|2bGF5y=S9A*y@@7d;f-T|<+O(HJi#U~K`N5OBP z&5@e~zlrv2dGk*e{PugAFFu914m0y_p*?RvqO=k|!bxw#8|VI~V~pIDi0z?E|1{d% z8lqop59Pd{AFJp2mg4s#_M0*P0^0h`PxW5HHb0$b&t1mPqK)@n>3!y~-CzF=w7H&{ z_PdR(e?NaeM*9wT(B*e9$Cb42un0EJeV25y3|JR+~SjQ0+8a_s3v#G0MGYurd|PO9evZ2Ow(;pg#% zdOifpDXwxoSHb2Rlj^yKEw8v> z`Spm6)i;mG{lgwYRYN~SjMe9FQR?%T*q*OH<$sMW@ABTxnOu6K@3H0dIdkI6 zv7QF@PDK9a$UVZ|gXl~3WY~{NlFnX+)8|Uu3bx!piEBpA`CDS1o!J~Q-+29=X^nn^ z`u^tK?TPPiA5tIJu0p1xn>`Ny!WTi<`Yq1gBSA6aU@qyPW_ diff --git a/data/shaders/deferredshadows/debug.vert b/data/shaders/deferredshadows/debug.vert index af5ced49..40833b18 100644 --- a/data/shaders/deferredshadows/debug.vert +++ b/data/shaders/deferredshadows/debug.vert @@ -5,12 +5,11 @@ layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUV; -layout (location = 3) in vec3 inNormal; layout (binding = 0) uniform UBO { mat4 projection; - mat4 model; + mat4 modelview; } ubo; layout (location = 0) out vec3 outUV; @@ -22,6 +21,9 @@ out gl_PerVertex void main() { - outUV = vec3(inUV.st, inNormal.z); - gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); + outUV = vec3(inUV.st, gl_InstanceIndex); + vec4 tmpPos = vec4(inPos, 1.0); + tmpPos.y += gl_InstanceIndex; + tmpPos.xy *= vec2(1.0/4.0, 1.0/3.0); + gl_Position = ubo.projection * ubo.modelview * tmpPos; } diff --git a/data/shaders/deferredshadows/debug.vert.spv b/data/shaders/deferredshadows/debug.vert.spv index 4300cf84548add6c1a36d80a5c8c3c5e782631f3..f7b69969182b0925a7d7ac192558a00932360e77 100644 GIT binary patch literal 1908 zcmY+D-BJ@l5QQfM0*Zo&{P>3n_zy-zKokiOwE|VCB5J|y)7MSM*=)~DzcCs82Fx4N9V4bk*qA|+OXo`UeYMz5>cz#S zc@#q?n+nkkoAc?qSN}(T7y-`7F32v)uE`cgQnl|lfY|# z@asX#i}ybU2TA*^Mq6Rj@DBZ`(eWFBx41Ch^bbCnK1DixE||09PO`hF8B88wltSVD zG^fU)w;i<;KRO7uqk8aFl2kjXIXP<9Vx5mKxrb2-g>z;>SiZHOwHLIKu3ygb+DiB0 zc9?{5Bz-om8=mzu&Aa6tsdMQXzS)YY7WoNJPmkhyaQHb4zG#i_bIqOo*i>wNQ^E`| z^?~sN)AK>uti{ye^jnHX4Gc7lisHj@H(T;2Pez{%y~8spdzRC~NzZeB`j% z7d^4i)02!09zB@;!i@GKAf?v{PE)~2K-+!ygy>oYrbdtu_jEd7iHWhnAjsS?kg6i*Ox8#R#CvCGJF`0 zyP`E5In|^h{+J9cd&DRy8{Qc_XQ8<+<8ED?o0ijb!ttG=Bev7svK+P66p7mNGW^lA z&l}-P>dnhseFd#g*EcN;x2gJgD|co1@P_cA=6f>u@3sf`Er+l3d!V)R<6JO0Vvye> zyT7A+>3h*~@QjS?hvKvMSjIl@(D~16P5d2ok$6vJaA>)2?wEdX=dNxviE6X-y@WkegzLxQwa6b8g K(fw29E3*IF>wA0v literal 1508 zcmY+ETW=FF5QUv=5(s`8DQHw`;?d!KrpX));RKHEmI zU;-;dvuMs)yQc4Pl%zOkh4aFqa80-`1o~7p|I((K6y099_i;a*#*-+Iia4Bpjs|fa zX2)ORlVbY6MoURL3`bEqoJGSp+}+upL?>TOU6D@b#V2<*D-Mq|<5NeHT33GE)|900 zvV0tkv?Qisu4o>P!hW0|#d#5bgKszmHWtfdLKUf-U@ynoZm-oVv(C#TbefohWFtZ_`D5& z)@AKtUrRAK8}_QKhUTWQCOvuZS#Qdpb2j`-=ko?wN6+g-Pb~EGs3O3l$EUw=tS>m* z$HS-JtgmRD-ZTZqmh+cn`}mh+qa`Q#*PYEf-B4BB6&$&)YNk#&YQg9C0!OavnwtXg z$c2AHV64lhZ^SBNm-ht+h~LyqUEBxp@mqqgb<^4Cef-<9D*}4X&i&xC&Y89ZW4^y3 z{u5c$N)6BTN{CA>4EWz-cssAe((elbz1|Z`pOyuBOaIUi|FQu8K^puOfqe|mt;&X@ zuD(><)tZ2oHDbJ01-t`z@^RL-!1?JR`8fA20p4rw$VNjSyymWK_@9cyo_hlO;L(u( zfk3Z(jSn5C=^yvVan$W~9mmnTz9P}f#{&D&vrf-{C^u{T0h1pMHFF0$0`G=%ac+Ec Jf7GED!e1~-UPJ%@ diff --git a/data/shaders/deferredshadows/deferred.frag b/data/shaders/deferredshadows/deferred.frag index 263a66e3..4562a767 100644 --- a/data/shaders/deferredshadows/deferred.frag +++ b/data/shaders/deferredshadows/deferred.frag @@ -31,6 +31,7 @@ layout (binding = 4) uniform UBO { vec4 viewPos; Light lights[LIGHT_COUNT]; + int useShadows; } ubo; float textureProj(vec4 P, float layer, vec2 offset) @@ -124,18 +125,21 @@ void main() } // Shadow calculations in a separate pass - for(int i = 0; i < LIGHT_COUNT; ++i) + if (ubo.useShadows > 0) { - vec4 shadowClip = ubo.lights[i].viewMatrix * vec4(fragPos, 1.0); + for(int i = 0; i < LIGHT_COUNT; ++i) + { + vec4 shadowClip = ubo.lights[i].viewMatrix * vec4(fragPos, 1.0); - float shadowFactor; - #ifdef USE_PCF - shadowFactor= filterPCF(shadowClip, i); - #else - shadowFactor = textureProj(shadowClip, i, vec2(0.0)); - #endif + float shadowFactor; + #ifdef USE_PCF + shadowFactor= filterPCF(shadowClip, i); + #else + shadowFactor = textureProj(shadowClip, i, vec2(0.0)); + #endif - fragcolor *= shadowFactor; + fragcolor *= shadowFactor; + } } outFragColor.rgb = fragcolor; diff --git a/data/shaders/deferredshadows/deferred.frag.spv b/data/shaders/deferredshadows/deferred.frag.spv index d0f517a6811f3b40168798e0e66328442fdff7a6..7735909564e9c566058bdbc4b33509ad70a57b0a 100644 GIT binary patch delta 1060 zcmY+D%W70X5QeLB&YWa|(M1@Xr6H><6@rK;jERZYOyYPQN0Sp1%}FLC8bn-;x(x_% z7CwPXFX7-DxN#p4B`@F$cmu)zJ9NW%hNA!a>#we=?w$`*`_n^F-)O&?({I4mcZM1+ z+fCP^N@9t9GqXO~x-@yOHzGEE8SQZ%%lth)uM!O}NBb-M{hSk$FWn z(?{ugp^Pp4&rdAN$4hnhDv1w?5nKV{a$`OKB0YR zswq2Su{FH^#rrGrBVn>mDvqD!Zw9wrjm85#pfJq`zbwDi;}d6u-gufnJg{Bv)HEes zOv?5pJFfMVD$&td&%c#sO#YO7xOw59>g${^-yi9TP0QeZX(sS#X=oGuZ*doVjP-|d zE;;MiWjTBZX1stkG*K63lU?7$tT5c3awv>{QKrp`!r+j5MVQ>0Cg*6c${6ygjM$#) z7h=x)nir6KM*emA@3hVp@4)Pad^o!x3lm1z~c?<(BcmJW{kLlttd6a78N`VrVKn69R08 z=$>$^d$c;-d8z(5hh;HKG9sjW@*Ee&<#F4rq22q!wEIl?yrKufa2z`M#Nc{g1eb>& tUXRw9VnZ5ORgj`#-ZlA|tZwCE{&lBj8XXGP!Mf9e_nk*_zy6Fc|ZUF delta 874 zcmY+CPfHt76vgjzOf;#1idd6fp>&}jbSou7v_|~bShcOywmMFXij+t!l&<1lD1=$` zTUf(za=7c4t6z$K@VQ!3P_b@%C;h;$`JZCG{vS_T5G^E1 zE<8;>b3ybgIqW^?wkzf8XuAw^>F-Y$4JqFe8eksY?%w z&kCcR3;&e`KBa|~QsBIFyz|0%3+jc-zSO#w{xyzKgIoqsisSGJ@kM8KI}v!LgOlt^ zkl6aQwWU}?Zfnc2#$*?DFk@JehM#=mS!oT`CH7jJ!^vSjj210#_4`}A72y_Dbw(qr z!f13#fi+=Fn3+2q%m+d4m|XbY3lC~1hZs4$8#=Yf`5=tennGQ|N0Fb}zo}csvLTK} zA_a({@tV9GPryzAo?ug$=8xou`@(2E0e)g=onHe_iGP#>%OV_tz-_n11Fe#!TD&5R RRu21fLkS|4Xf*dD{SVo0VxRy3 diff --git a/data/shaders/deferredshadows/deferred.vert b/data/shaders/deferredshadows/deferred.vert index 48e1365c..e13d0aff 100644 --- a/data/shaders/deferredshadows/deferred.vert +++ b/data/shaders/deferredshadows/deferred.vert @@ -10,7 +10,6 @@ layout (binding = 0) uniform UBO { mat4 projection; mat4 modelview; - mat4 lightMVP; } ubo; layout (location = 0) out vec2 outUV; diff --git a/data/shaders/deferredshadows/deferred.vert.spv b/data/shaders/deferredshadows/deferred.vert.spv index bc47c34a89840040e067fb3a5788758c287f5f9e..5f41a5edb365b45e1654e0832b6690e271e331ae 100644 GIT binary patch delta 25 hcmeysHHT|M0^{Tg#xt91n4}n)Sr|k%&t<;M2mp0j2p9kW delta 97 zcmbQk^?_?c0;4D!0~><~0|NsS5a(p3XO#Gc1u#sGWjwFz!N3BSVFk*1FtEb;%0PYt Uve;%tCRIjuhyvlwp3IjS0n>#Hvj6}9 diff --git a/deferredshadows/deferredshadows.cpp b/deferredshadows/deferredshadows.cpp index e18eb570..83a2c4ab 100644 --- a/deferredshadows/deferredshadows.cpp +++ b/deferredshadows/deferredshadows.cpp @@ -26,7 +26,7 @@ #define ENABLE_VALIDATION false // Shadowmap properties -#define SHADOWMAP_DIM 2048 +#define SHADOWMAP_DIM 1024 // 16 bits of depth is enough for such a small scene #define SHADOWMAP_FORMAT VK_FORMAT_D32_SFLOAT_S8_UINT @@ -50,12 +50,13 @@ class VulkanExample : public VulkanExampleBase { public: bool debugDisplay = false; + bool enableShadows = true; // Keep depth range as small as possible // for better shadow map precision float zNear = 0.1f; float zFar = 64.0f; - float lightFOV = 120.0f; + float lightFOV = 100.0f; // Depth bias (and slope) are used to avoid shadowing artefacts float depthBiasConstant = 1.25f; @@ -110,6 +111,7 @@ public: struct { glm::vec4 viewPos; Light lights[LIGHT_COUNT]; + uint32_t useShadows = 1; } uboFragmentLights; struct { @@ -170,7 +172,7 @@ public: VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION, getEnabledFeatures) { enableTextOverlay = true; - title = "Vulkan Example - Deferred shading with shadow mapping"; + title = "Vulkan Example - Deferred shading with shadows (2016 by Sascha Willems)"; camera.type = Camera::CameraType::firstperson; camera.movementSpeed = 5.0f; camera.rotationSpeed = 0.25f; @@ -510,23 +512,18 @@ public: VkDeviceSize offsets[1] = { 0 }; vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.deferred, 0, 1, &descriptorSet, 0, NULL); - if (debugDisplay) - { - vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.debug); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 1); - // Move viewport to display final composition in lower right corner - viewport.x = viewport.width * 0.5f; - viewport.y = viewport.height * 0.5f; - vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); - } - // Final composition as full screen quad vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.deferred); vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], 6, 1, 0, 0, 1); + vkCmdDrawIndexed(drawCmdBuffers[i], 6, 1, 0, 0, 0); + + if (debugDisplay) + { + // Visualize depth maps + vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.debug); + vkCmdDrawIndexed(drawCmdBuffers[i], 6, LIGHT_COUNT, 0, 0, 0); + } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -545,10 +542,9 @@ public: loadMesh(getAssetPath() + "models/openbox.dae", &meshes.background, vertexLayout, &meshCreateInfo); } + /** @brief Create a single quad for fullscreen deferred pass and debug passes (debug pass uses instancing for light visualization) */ void generateQuads() { - // Setup vertices for multiple screen aligned quads - // Used for displaying final result and debug struct Vertex { float pos[3]; float uv[2]; @@ -559,22 +555,10 @@ public: std::vector vertexBuffer; - float x = 0.0f; - float y = 0.0f; - for (uint32_t i = 0; i < 3; i++) - { - // Last component of normal is used for debug display sampler index - vertexBuffer.push_back({ { x + 1.0f, y + 1.0f, 0.0f },{ 1.0f, 1.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, (float)i } }); - vertexBuffer.push_back({ { x, y + 1.0f, 0.0f },{ 0.0f, 1.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, (float)i } }); - vertexBuffer.push_back({ { x, y, 0.0f },{ 0.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, (float)i } }); - vertexBuffer.push_back({ { x + 1.0f, y, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, (float)i } }); - x += 1.0f; - if (x > 1.0f) - { - x = 0.0f; - y += 1.0f; - } - } + vertexBuffer.push_back({ { 1.0f, 1.0f, 0.0f },{ 1.0f, 1.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); + vertexBuffer.push_back({ { 0.0f, 1.0f, 0.0f },{ 0.0f, 1.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); + vertexBuffer.push_back({ { 0.0f, 0.0f, 0.0f },{ 0.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); + vertexBuffer.push_back({ { 1.0f, 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, @@ -1040,14 +1024,7 @@ public: void updateUniformBuffersScreen() { - if (debugDisplay) - { - uboVS.projection = glm::ortho(0.0f, 2.0f, 0.0f, 2.0f, -1.0f, 1.0f); - } - else - { - uboVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); - } + uboVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); uboVS.model = glm::mat4(); uint8_t *pData; @@ -1079,7 +1056,6 @@ public: }; std::vector lightColors = { -// glm::vec4(1.0f), glm::vec4(1.0f, 0.5f, 0.5f, 0.0f), glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(1.0f, 1.0f, 1.0f, 0.0f), @@ -1209,6 +1185,12 @@ public: updateUniformBuffersScreen(); } + void toggleShadows() + { + uboFragmentLights.useShadows = !uboFragmentLights.useShadows; + updateUniformBufferDeferredLights(); + } + virtual void keyPressed(uint32_t keyCode) { switch (keyCode) @@ -1218,24 +1200,23 @@ public: toggleDebugDisplay(); updateTextOverlay(); break; + case 0x71: + case GAMEPAD_BUTTON_B: + toggleShadows(); + updateTextOverlay(); + break; } } virtual void getOverlayText(VulkanTextOverlay *textOverlay) { #if defined(__ANDROID__) - textOverlay->addText("Press \"Button A\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"Button A\" to toggle debug view", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"Button A\" to toggle shadows", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #else - textOverlay->addText("Press \"F1\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"F1\" to toggle debug view", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"F2\" to toggle shadows", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #endif - // Render targets - if (debugDisplay) - { - textOverlay->addText("World space position", (float)width * 0.25f, (float)height * 0.5f - 25.0f, VulkanTextOverlay::alignCenter); - textOverlay->addText("World space normals", (float)width * 0.75f, (float)height * 0.5f - 25.0f, VulkanTextOverlay::alignCenter); - textOverlay->addText("Albedo", (float)width * 0.25f, (float)height - 25.0f, VulkanTextOverlay::alignCenter); - textOverlay->addText("Final image", (float)width * 0.75f, (float)height - 25.0f, VulkanTextOverlay::alignCenter); - } } };