From 0e88fb681153a1887b8522aedb0dea0b4bdd6e21 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 27 Jun 2016 01:26:48 -0700 Subject: [PATCH] Don't render the reflection on the far side of the floor --- data/shaders/offscreen/mirror.frag | 27 ++++++++++++++----------- data/shaders/offscreen/mirror.frag.spv | Bin 2588 -> 2800 bytes data/shaders/offscreen/mirror.vert | 13 ++++++++---- data/shaders/offscreen/mirror.vert.spv | Bin 1440 -> 2632 bytes 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/data/shaders/offscreen/mirror.frag b/data/shaders/offscreen/mirror.frag index 9785cf09..669be8ce 100644 --- a/data/shaders/offscreen/mirror.frag +++ b/data/shaders/offscreen/mirror.frag @@ -8,6 +8,7 @@ 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; @@ -15,6 +16,7 @@ void main() { vec4 tmp = vec4(1.0 / inPos.w); vec4 projCoord = inPos * tmp; + // Scale and bias projCoord += vec4(1.0); projCoord *= vec4(0.5); @@ -22,18 +24,19 @@ void main() // Slow single pass blur // For demonstration purposes only const float blurSize = 1.0 / 512.0; - vec4 reflection = vec4(0.0); - for (int x = -3; x <= 3; x++) - { - for (int y = -3; y <= 3; y++) - { - reflection += texture(samplerColor, vec2(projCoord.s + x * blurSize, projCoord.t + y * blurSize)) / 49.0; - } - } - + vec4 color = texture(samplerColorMap, inUV); - outFragColor = color * 0.25; - outFragColor += reflection * 1.5 * (color.r); - + + if (inNormal.z > 0) { + vec4 reflection = vec4(0.0); + for (int x = -3; x <= 3; x++) + { + for (int y = -3; y <= 3; y++) + { + reflection += texture(samplerColor, vec2(projCoord.s + x * blurSize, projCoord.t + y * blurSize)) / 49.0; + } + } + 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 0f9710bb58275808125c0d280e6589036861e703..ede82a398367dd78a3307a19f9d728d3ec61887c 100644 GIT binary patch literal 2800 zcmZ9NTXR%Z5JorTB8YO4n+VFps8NFvV?Z>LkOUJi0b?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 literal 2588 zcmZ9NYjcxT5XTQKDIm&4ZX#Y%s(7JR#DZw0wJlOFK`L1A9v{*)q@+nE2{ZbxzHr7@ zei^@jajfYvIUY)&op_|nnq!O7%YnP~T zfEt6XZtin0&Gu@Cbl9bI9NF!4HkUh{-g?2ki0sujT2yUzIDt7{g8MP|kEb`0Kjr#F zdJoypwz{o)Z@JUz^f2=}UmL#|MRVI zBKQ3Qu*cfgJq!H8oc7_c57*WPe<~KB4a}s?5t_)5Q@BL}p z>oR}$Bjv<-Y<*9Fl(rZ2A4J;&^v@NxXOcUC{S>kc{9Lbn2sl};Ka4ciywhYc&ojUp zqlnsP;Q1CJ_Bjl>QABJR-Y;S&(aXEw9_^>R`*2TFNcSOcF6GPM(az3J*wfga;W!N`(?p$AJ7O<~f1;)n_i_P5|?VeG=W6U&yWh6fj2K z^`1{I;!mT?{anO9i!SH;hs~~@4g9P- zi`1`-x|h(+5p^%4%SB!7w}81^tM1z2dmFwrXTf(h5A2=q%@}840mw(a570elr|>VL z%h_+^mx0_8@Xq9}0rL!f!&=v|t>s&dS}W-CQR^dg&la^lMwg3PpP8e=$o*FIY`x%WNaOuol#BQ}y8Vmz2D;n^h?%^P lZqCt}Y+}pDx=nP~%17=8=+=w7X`#y*8+(y^#4q_3@E@Pgz{~&u diff --git a/data/shaders/offscreen/mirror.vert b/data/shaders/offscreen/mirror.vert index 7e4bb2d8..62423db0 100644 --- a/data/shaders/offscreen/mirror.vert +++ b/data/shaders/offscreen/mirror.vert @@ -15,14 +15,19 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; layout (location = 1) out vec4 outPos; +layout (location = 2) out vec3 outNormal; -out gl_PerVertex -{ - vec4 gl_Position; -}; +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]); +} 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 e7b7d46ea8ce2c3a5a4bd33f14f8f721150f2a5c..a35245f9cb427add48f50c4e80c75aa61977fcf5 100644 GIT binary patch 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 literal 1440 zcmY+C+fEcg5QZC;UGW4Wa`1$^;29;vpfNEX;AXiXh#I(^3@}+o*&VWn#7kd6AIYck z#>DTN-Ai5oTILbS%m=FB zx(8XepZx%q`Q=@n6}`N?z+BGARpsZb^3HD2ZKqxpnxmeU1T3*ViLFU&PZ4i}t=Cn> zw)u~ErDV@@Jb-Ym)D7dzc{WaL+y^Y?l8bT8(G2~z*5X{2F;~QmAuO@8ioKXG&SdzK zjH#4d%;!AR`|4(SLGlfd*!?`a8orJ#aKCklJ*$H!@oMGYjIeJ+&htz7F)W^otwqj! zSMlcaovEL~8!K-m;ph7$qWm7#?_H1a=8-d2>|2$Kx%@un zdd0W2F8g+=`3vJ)dJF4(uVBvh9jAT+@g@p;TELuxy{fmrMNB?wZn0Nmzfp6Wz5H+T z7;^_RPF{_D*D-tkgvNfCu{!38+zR_TW-pPuKjQ3bj}Dy61I&2!o;R>x