From 876f5714eb0925c1f0ebe1e9fe29cbe0e5b78234 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Wed, 6 Jul 2016 21:13:24 +0200 Subject: [PATCH] Use gl_FrontFacing to determine mirrored surface side, enable clipping (Refs #190) --- data/shaders/offscreen/mirror.frag | 13 +++++++------ data/shaders/offscreen/mirror.frag.spv | Bin 2800 -> 2732 bytes data/shaders/offscreen/mirror.vert | 14 ++++---------- data/shaders/offscreen/mirror.vert.spv | Bin 2632 -> 1384 bytes data/shaders/offscreen/phong.vert | 7 +++---- data/shaders/offscreen/phong.vert.spv | Bin 1828 -> 2180 bytes offscreen/offscreen.cpp | 7 ++++--- 7 files changed, 18 insertions(+), 23 deletions(-) diff --git a/data/shaders/offscreen/mirror.frag b/data/shaders/offscreen/mirror.frag index 669be8ce..54d54d1b 100644 --- a/data/shaders/offscreen/mirror.frag +++ b/data/shaders/offscreen/mirror.frag @@ -8,18 +8,17 @@ layout (binding = 2) uniform sampler2D samplerColorMap; layout (location = 0) in vec2 inUV; layout (location = 1) in vec4 inPos; -layout (location = 2) in vec3 inNormal; layout (location = 0) out vec4 outFragColor; void main() { vec4 tmp = vec4(1.0 / inPos.w); - vec4 projCoord = inPos * tmp; + vec4 projCoord = inPos * tmp; // Scale and bias - projCoord += vec4(1.0); - projCoord *= vec4(0.5); + projCoord += vec4(1.0); + projCoord *= vec4(0.5); // Slow single pass blur // For demonstration purposes only @@ -28,7 +27,9 @@ void main() vec4 color = texture(samplerColorMap, inUV); outFragColor = color * 0.25; - if (inNormal.z > 0) { + if (gl_FrontFacing) + { + // Only render mirrored scene on front facing (upper) side of mirror surface vec4 reflection = vec4(0.0); for (int x = -3; x <= 3; x++) { @@ -38,5 +39,5 @@ void main() } } outFragColor += reflection * 1.5 * (color.r); - } + }; } \ No newline at end of file diff --git a/data/shaders/offscreen/mirror.frag.spv b/data/shaders/offscreen/mirror.frag.spv index ede82a398367dd78a3307a19f9d728d3ec61887c..c75e397f61d00eb1becd076e3051a747d679d49d 100644 GIT binary patch literal 2732 zcmZ9MX>(Ln5QYzA5ky&J6H%EMH7Xbp1EP_{B$&7ajjZm&C7BEpCUeKhP^I7E2dn(# zpYab^{wQ3ksQ5g0Zd+Gw>P>gQ-KV?HIelhm_xNKe?c#4w>ZQSVDDB2hXNM-^tkb-oH5>J*b7#BR>b*2VrfU5W zYV4&(f3sWo?5EXP$w`Mjl8zv|y?kRK&wFbHH=Ir(SMzr68H}*+apYFE*=;v^3({Az zK`!^z>fE@ADB|2>e!sui%bG=8@b0_Wt}piTPJc05rSC!Q^YFdKdYj#~a!$)$--Y`D zs9#3@Sm>i^8CmTCGcB=G_wzjP{I%`%1>hI<7`o@IZO_L0Y1?zvw%2{&Q0cdBHJ`Tm ztaq5K<{hI~r$GG}+9klA}HSZa+nCEF=jVhw{NqD~5h(Pz}zU=B|EWpQM8^9JK<& z|DBnf`|u3C8$ZwGC8YU0Gy8rSxeLe}uRT$6`d>qLk8v*A-kn_R<#qIwwr7rz^$j%F z`AE&HZC-8fST5FGK=+F?cpF`=3eWx`Tn)I^-0vXmN8Vh@Y4C7oXD94=YD zn{(;!M4Yd-zYSH}--W8}`wiQ(@a>!@Rh-L%z*%-)FHzHd`p)EkAx8Tt;GD{@ zu-f&9fqWG+?7)8YnajAN!2Dq!LpSDUa_c`1jFES}`;&|K6X25 z4(5P4exp}=StvQ*gFR?p0_Jkz7K~dDK=$zPsq&P2_8#%SAqYa^{N}cOGLu8|dyQ-dh`8&fnCyw@vg@pgJQR nZ24H1qq|lLkOUJi0b?TIeK;gTm@t_$&P*(Qiw{=$ z3# z>df+NwNqTNPK=*#Wvlno0GZ15 z2dJ^18r{uS&*y&X&83`l*aPVpvenKv=JLF~*5mrqS>$To$lE=8FbyL+*=DOzYtKnv z%XV|wSG{@TCW1_Zy&m(e?tD92@5Sx%1HHcM&Fgu4GiwC*4obUrw?Sw1oRe~&Q*hq{ z_4koK^z^~Bge=#`Obc{rFV6wbUfX>>5B$O&Lidcd-LLU}+TKao_I|V@-n!*{+UB#~ zQKF0+Vy{ks`U$i_WCffgzjv(deN_0n4=E=`vGqL;Qre!@e*n$g`X>w99_5Z>KZ&dW zKi6v?1lD)`A*8Y9Jx3PvJPoW-M$|qH&o>>hXE5Z-IK}i-;LK_6@)!1Lb})pa(nJ4$ zXC`MKo}qW+=efLyG@obYzF$J_0rJLcj})B#SJCY;&PCh1lZ#$nLr-aY%KWdRnLp0O zhiZO#^J{z8a&eC1=O2lfW2x*V~_5#GgW!`>}|B z23^kg74dQr|17%kk>B4HxicW*<%}Ofz5s>`+jsCX7y-A6das}xBky|8TQ2IILznxd zh#y0j^IaJ4dy$LteiPj{Fb>S&`Az`&-^k(2zg2L~`k&-@8|n8C@%kgx=ucMnI>VAwa7j?Bi1m<$Bx@*11Pk`^(b6!Dy3Y>#w5a)cO z;G^D6Z2Qc~;XT{}a?XzS=LP3`cmCwQ0OrvbwZ1~PmcIj0>uYrRsPzrHy+y4mx?I${ zjV@QNm0_FbHdvy*^LYoj2YoT4tLXNxFWzSjeeDtWo_%w7foqI$e{$=<8M069dj)4~ z%$J;Z=RJD<%IL3-ZhzaXcZTi*Ie+_NHso9%v*A5zJCEj5M!p8RcN6(G(d8naJ~`K4 zLAu^~jDDKv_7m^2g)ZlBZ`|9r=x0HBM%vi&v95#eTKUM`MIQxmR$J(D#@eesIrkRt MRQZtq1ulVq0muo~1^@s6 diff --git a/data/shaders/offscreen/mirror.vert b/data/shaders/offscreen/mirror.vert index 62423db0..180c65a2 100644 --- a/data/shaders/offscreen/mirror.vert +++ b/data/shaders/offscreen/mirror.vert @@ -5,7 +5,6 @@ layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUV; -layout (location = 3) in vec3 inNormal; layout (binding = 0) uniform UBO { @@ -15,19 +14,14 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; layout (location = 1) out vec4 outPos; -layout (location = 2) out vec3 outNormal; -mat3 mat3_emu(mat4 m4) { - return mat3( - m4[0][0], m4[0][1], m4[0][2], - m4[1][0], m4[1][1], m4[1][2], - m4[2][0], m4[2][1], m4[2][2]); -} +out gl_PerVertex +{ + vec4 gl_Position; +}; void main() { - mat3 rotation = mat3_emu(ubo.model); - outNormal = rotation * inNormal; outUV = inUV; outPos = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); gl_Position = outPos; diff --git a/data/shaders/offscreen/mirror.vert.spv b/data/shaders/offscreen/mirror.vert.spv index a35245f9cb427add48f50c4e80c75aa61977fcf5..49f2eab648089e0c38a8a85c1ba78f12c090c9ff 100644 GIT binary patch literal 1384 zcmY+DTW`}q5QR5MV+w_qQhMPQoQ8W*RiT2A5SR8PeTYN=wXc@jtb!r6BioU9M;)gooewkJ z(N;~X;>U*{)oI}NqGp_nEhHQCu|=5o?wlDd@Qfq5)Gok+=)U#e7)(y8cc@9jAUc_j6ADo*#)*8>=lG>FIgTsTVc9Xmj29 zRdM8;kAoBULGZcId|bbt7w?f;n8CKd^1NG7$C-=og?zq$dSa0ejeKi*V!P7#y4Y`M z7s!UfrtYH-IA@{wqAb4XZ)(o_N8_9?vmy9%ICrCw@0u+6_=fObmL(RQd~oKCwk6K& zIK#iAC$mNa#NUvmHgw|Q%m{5={HAOuaQ{xt*R^L6zafh+`TY4U?eVAHd$QE)`}5xc zI`_euxzCSpS1{)1`;MZRHT84X6It@05eu*Wr^dX}yP^*IWa0N$3g60Gsm$}Lz%1YC zl$pa1 z^|TL##+>$`*63@f4w%D3fq48m?+U+^m$OF#_v1s4dth7 literal 2632 zcmZ9N>rxXz5QRrbqIg$Oyka8WQKU2~-jLuWsHg$NyQWrHaW%6xBk?e81i=-dYV+vMK4-q_{(gq>q9rgKU27FY0mb#8HPypybq zmoH6-cH3P)laK9iTfLvtZ!?HmfGJr;c271ddnlWiy_WUsU!UfmDwuNvt~yt*EX>q9 z;aboRlCa+S7_5Ztdi?%VxSVwU)hHCTR_l$Rwb~67j$dwnB90)L3wDj zeb&i5{A zdFbQxQSn-=zEFprMlBD83+|=xYNK8Y+t0#w5`Gc%=YVGri#w4&NWpFNdd}hbsFf^6 zUqf^jN58N?hR{Nt*jJ#}CzlKLW`!A2`Wu zFOPj?^T6ay%WN$;%d4h$$DXUI&3zn|F$|Y_&|}`{h|Khr6mu^0+y!w4n0E}OCYZa( zV(!B9?9Y0>MLfee^5K|`V-IlDHVz+-cg@*Y58a@CnM>l(;O~`J&|H)aD}$bZ$=#>l zO`74rMg0z>7#{s*&FEPVJ$2#0C1L);;mF$~%smxloM9}*yW}&7@77!dXb=Yvdeo~w zB;WRE@nLbc9{K|^&SvW$&cvyIEE8w%V>0Ky-9isO>v6B%Mfud@3?qv34mmqUKQ3#g z7X0-T^M2rnUrl|}-xQ`d^awq8D&^2m%jYZ>2Uk*#e&3PL9&P=*@>vg_^}zR1j`gbY zSkLAsZY;GGZv z&+>l%IdKehzr^r2i^uRhbBpVErx!B?f{?rzBV zuEP^&eK>N7-;%+B>HUn1zJFIf__hoUJo(%i9C~_tUq)Yv(SNY*bxuBe<(=DJAIXO| z&13ohpXZ4<_#fH>=c~!cgSUMy$mf3MrQr@1WpE7Rp2~;g4vkw%Io?rCou=3P-$6cl z;$t$-Pwcsj`e-;KZv>8g5Pu_s<2<~fw=(XVGouHi`K?_{%6J3xojYOhowy<$cg_E^ zyoVi{D>~JX<~=FTdV@0Ra^Af%Vy4?CpL}$~GSlssPt0@&<(rQ0h3O8-CuTan%jkG# z*}6xBiJ7h_-*nl!CGo^ecQm8R)*Tg3%yh?7-7(GCx+jE*neJppm#uqBJTcRq&gimr y&xj{hQ#X0%=VbJhe$fl#$K`Wo&cj}fKQEs>QIECYxz`C9YmtZMkM0wWyZ;Nj1hz>4 diff --git a/data/shaders/offscreen/phong.vert b/data/shaders/offscreen/phong.vert index 5f802b0d..de1be5da 100644 --- a/data/shaders/offscreen/phong.vert +++ b/data/shaders/offscreen/phong.vert @@ -22,6 +22,7 @@ layout (location = 3) out vec3 outLightVec; out gl_PerVertex { vec4 gl_Position; + float gl_ClipDistance[]; }; void main() @@ -33,8 +34,6 @@ void main() outLightVec = normalize(ubo.lightPos.xyz - outEyePos); // Clip against reflection plane - //vec4 clipPlane = vec4(0.0, -1.0, 0.0, 0.0); - - //gl_ClipDistance[0] = dot(inPos, clipPlane); - + vec4 clipPlane = vec4(0.0, -1.0, 0.0, 1.5); + gl_ClipDistance[0] = dot(inPos, clipPlane); } diff --git a/data/shaders/offscreen/phong.vert.spv b/data/shaders/offscreen/phong.vert.spv index 05e10191b4a8878ace24c6a635fa9f6221786589..44f4971ad23f8f3520574b4accb7f1b4b142e866 100644 GIT binary patch literal 2180 zcmZ9MYflqF6ov=d0t$kNTvWsbyn~1ch$5GAv3_U-HS)Dt%BHNAUD7Uzek1W0X#77K zf0bWMe4p7JsSY`v^Sed)m8AhsCAx+wx2^IhdJW zn8mZ#k0RZ~G3TlqzTrm&MoWmEEAR7c`RKBYqtjkB%*FhDjJl zVmqxrvlPEs50AIPX5vTHK)G{v9>kzu)&6c{$L2z39XDc5PAc&Q>qD-i_#ogM)Ww$> z*2CIiqRLWjzESNb`?2)Aop~6gM$XRsbLoj`Uxpy!iXK`tMYU6h*DP{Kq$C;SzgoNercnU4%jknH-dAk|l&#b|m zbwHCL@3;^ceMnk|c26=ae|iIB_k_DL9ez2(+>5iHm+sDl9n5UuoIm%3zq4~s*r~_- zsK<9SsNa6=o`f}(;Y-r-9~BMJNv9_Eo0(1>;=$abv)`3Yzs}Ab zaIbELVD1&{^3O|m^%pXoc9$eCPDCBFx?+;k~TNn|B3vwm#{+6>PjAa8cQqFK?Qe zb9eYN>l+ey=QA!HA5Y?ZCZxlERUTp{CB(tw!&z@jxQ{RL0pF3}2TyM9=bnUjMSc1M z9=5Mwj~A@!mW)X42*XeVW~%rw&>(K{2LKp)Ac z^2Wsf+q1V+H(BiU|LeHdnwExZXN(!r->7+JiZf+~g^d|ABld1I-#1tKd3$ATy^hC( zDOpE+Ce3-Pm-YWRj1$0F$(RJogk)N>B)KCYK}mnZx_>G`S>BCiu=Q>`=tsRU3-c)G zABF8G3(~`nQ7iBN>myT~bb@Y}bWXxf6s)b*dtvL7sVLK64;3-=k)Gsl((E|wN{6Gb zIQdIijy~nLlXlZgs<^W4J5CC!qB%^7?{tIxC_9L%%;c({@C!q%auIy56zRS8#4pZr6JJ&cVjJ%H- z>n*!qqEn8Ui))hRAZnS0;+V~Xgac+SU^WY8CSZC3vqv!fyjC6N!6A;*P$XPoFWcVX zD-!(uyK9g-gPcA&95n~yz{I_h_&B)JxFSEb@%t*FA3s0(XJ$(hj>n4yv>4mq zJeZ?@FaFFB%zUQxN@^_%fzfBBjp(jQ=HyRrVC+@lQK!Q{cbFY``#I_UP1wQA7S8*# z6a2lMonWUP^P?WWfdzT73pi?D)J+^5v0#3aa5KV}bXO(hT6TCwI%i&ZRyVnd+{LWn zJWq{zVdlWhsR3r@aM-Unofu!^x^!w{UvxTkhzBn@4*MeQrpH|Dim@R3*g0<3ryy2{ZXFAMi~{RRT|LW^`M^ZmCayVElaTyVC!! zeNP;`uXA7eV4Y=QeBj@z4&T`W2|UMh52eEm4R9-tW8V9UWVVka#N&^hKG`KaeX^@3 z68dC^zOOaM@9Eb>o^=Tv!l5p8@W;L(A@4Wk1V5D!13&J1*_2M)t^_;1@EyVbmSt1& E2j`G^2mk;8 diff --git a/offscreen/offscreen.cpp b/offscreen/offscreen.cpp index 166a2a6b..29d84f71 100644 --- a/offscreen/offscreen.cpp +++ b/offscreen/offscreen.cpp @@ -789,14 +789,15 @@ public: VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.debug)); - // Flip culling - rasterizationState.cullMode = VK_CULL_MODE_BACK_BIT; - // Mirror shaderStages[0] = loadShader(getAssetPath() + "shaders/offscreen/mirror.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/offscreen/mirror.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + rasterizationState.cullMode = VK_CULL_MODE_NONE; VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.mirror)); + // Flip culling + rasterizationState.cullMode = VK_CULL_MODE_BACK_BIT; + // Phong shading pipelines pipelineCreateInfo.layout = pipelineLayouts.shaded; // Scene