From e3234db0418d5441230a2ac56ac310d25979e325 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Thu, 21 May 2020 15:34:09 +0100 Subject: [PATCH] Add inverseModelView UBO to fix texturecubemap sample --- data/hlsl/README.md | 2 +- data/hlsl/texturecubemap/reflect.frag | 14 +++++++++++++- data/hlsl/texturecubemap/reflect.vert | 9 ++++----- data/hlsl/texturecubemap/skybox.vert | 3 +-- data/shaders/texturecubemap/reflect.frag | 15 +++++++++++---- data/shaders/texturecubemap/reflect.frag.spv | Bin 2736 -> 3128 bytes data/shaders/texturecubemap/reflect.vert | 16 +++++++--------- data/shaders/texturecubemap/reflect.vert.spv | Bin 2468 -> 2404 bytes data/shaders/texturecubemap/skybox.frag.spv | Bin 568 -> 568 bytes data/shaders/texturecubemap/skybox.vert.spv | Bin 1300 -> 1300 bytes examples/texturecubemap/texturecubemap.cpp | 8 +++++--- 11 files changed, 42 insertions(+), 25 deletions(-) diff --git a/data/hlsl/README.md b/data/hlsl/README.md index 33c11849..8630f4f5 100644 --- a/data/hlsl/README.md +++ b/data/hlsl/README.md @@ -78,7 +78,7 @@ Shaders written to mirror the GLSL versions at `eddd724`. There have been change | texture | ☑ | ☑ | ☑ | ☑ | texture3d | ☑ | ☑ | ☑ | ☑ | texturearray | ☑ | ☑ | ☑ | ☑ -| texturecubemap | ☑ | ❌ | ☑ | ❌ +| texturecubemap | ☑ | ❌ | ☑ | ☑ | texturemipmapgen | ☑ | ☑ | ☑ | ☑ | texturesparseresidency | ☑ | ☑ | ☑ | ☑ | triangle | ☑ | ☑ | ☑ | ☑ diff --git a/data/hlsl/texturecubemap/reflect.frag b/data/hlsl/texturecubemap/reflect.frag index 0d664402..0725da78 100644 --- a/data/hlsl/texturecubemap/reflect.frag +++ b/data/hlsl/texturecubemap/reflect.frag @@ -3,6 +3,16 @@ TextureCube textureColor : register(t1); SamplerState samplerColor : register(s1); +struct UBO +{ + float4x4 projection; + float4x4 model; + float4x4 invModel; + float lodBias; +}; + +cbuffer ubo : register(b0) { UBO ubo; } + struct VSOutput { [[vk::location(0)]] float3 Pos : POSITION0; @@ -16,7 +26,9 @@ float4 main(VSOutput input) : SV_TARGET { float3 cI = normalize (input.ViewVec); float3 cR = reflect (cI, normalize(input.Normal)); - cR.x *= -1; + + cR = mul(ubo.invModel, float4(cR, 0.0)).xyz; + cR.x *= -1.0; float4 color = textureColor.SampleLevel(samplerColor, cR, input.LodBias); diff --git a/data/hlsl/texturecubemap/reflect.vert b/data/hlsl/texturecubemap/reflect.vert index 77bed827..9323ee4c 100644 --- a/data/hlsl/texturecubemap/reflect.vert +++ b/data/hlsl/texturecubemap/reflect.vert @@ -9,9 +9,8 @@ struct VSInput struct UBO { float4x4 projection; - float4x4 view; float4x4 model; - float3 camPos; + float4x4 invModel; float lodBias; }; @@ -30,14 +29,14 @@ struct VSOutput VSOutput main(VSInput input) { VSOutput output = (VSOutput)0; - output.Pos = mul(ubo.projection, mul(ubo.view, mul(ubo.model, float4(input.Pos.xyz, 1.0)))); + output.Pos = mul(ubo.projection, mul(ubo.model, float4(input.Pos.xyz, 1.0))); output.WorldPos = mul(ubo.model, float4(input.Pos, 1.0)).xyz; - output.Normal = -mul((float3x3)ubo.model, input.Normal); + output.Normal = mul((float3x3)ubo.model, input.Normal); output.LodBias = ubo.lodBias; float3 lightPos = float3(0.0f, -5.0f, 5.0f); output.LightVec = lightPos.xyz - output.WorldPos.xyz; - output.ViewVec = output.WorldPos - ubo.camPos; + output.ViewVec = -output.WorldPos; return output; } diff --git a/data/hlsl/texturecubemap/skybox.vert b/data/hlsl/texturecubemap/skybox.vert index 9c1e78a9..e15e7eab 100644 --- a/data/hlsl/texturecubemap/skybox.vert +++ b/data/hlsl/texturecubemap/skybox.vert @@ -3,7 +3,6 @@ struct UBO { float4x4 projection; - float4x4 view; float4x4 model; }; @@ -20,6 +19,6 @@ VSOutput main([[vk::location(0)]] float3 Pos : POSITION0) VSOutput output = (VSOutput)0; output.UVW = Pos; output.UVW.x *= -1.0; - output.Pos = mul(ubo.projection, mul(ubo.view, mul(ubo.model, float4(Pos.xyz, 1.0)))); + output.Pos = mul(ubo.projection, mul(ubo.model, float4(Pos.xyz, 1.0))); return output; } diff --git a/data/shaders/texturecubemap/reflect.frag b/data/shaders/texturecubemap/reflect.frag index a7990182..161f4cd4 100644 --- a/data/shaders/texturecubemap/reflect.frag +++ b/data/shaders/texturecubemap/reflect.frag @@ -2,21 +2,28 @@ layout (binding = 1) uniform samplerCube samplerColor; +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 model; + mat4 invModel; + float lodBias; +} ubo; + layout (location = 0) in vec3 inPos; layout (location = 1) in vec3 inNormal; layout (location = 2) in float inLodBias; layout (location = 3) in vec3 inViewVec; layout (location = 4) in vec3 inLightVec; -layout (location = 5) in mat4 inInvModelView; layout (location = 0) out vec4 outFragColor; -void main() +void main() { vec3 cI = normalize (inPos); vec3 cR = reflect (cI, normalize(inNormal)); - cR = vec3(inInvModelView * vec4(cR, 0.0)); + cR = vec3(ubo.invModel * vec4(cR, 0.0)); cR.x *= -1.0; vec4 color = texture(samplerColor, cR, inLodBias); @@ -28,5 +35,5 @@ void main() vec3 ambient = vec3(0.5) * color.rgb; vec3 diffuse = max(dot(N, L), 0.0) * vec3(1.0); vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.5); - outFragColor = vec4(ambient + diffuse * color.rgb + specular, 1.0); + outFragColor = vec4(ambient + diffuse * color.rgb + specular, 1.0); } \ No newline at end of file diff --git a/data/shaders/texturecubemap/reflect.frag.spv b/data/shaders/texturecubemap/reflect.frag.spv index badefb3880f5e7ac6a5510382af5a5399fa3195f..9e5a3629d8e9a6addd2999eaea15c46a96a6c437 100644 GIT binary patch literal 3128 zcmZ9NTXR%J6h;r3OhAbNL=Z$VA>P4=3K2zM5|9Kj@9*1}-o3l~q&6_VKg;%I2l)FjE60&+04B>0W<$k1Gk0%p zVsooKapB^5Jw~!x;i%6cyat(-ZZq#`IEWlZK0>CDPmnfpm^l4d5Us{4S@sV}>af-L zI<}{%}^G?{s^j3eZzrkE5Vv>2Y z*&3j9E z=jXyq_F6UzM_bSbvw7xbcRBC$whDX?+|E~4wl_QAdiFJVbG_5rUTa!5%usPg{q3!r z8_m_-x@X8`|4-}05PP;_`!@@Y9@h(8_7*i8_lGe{_VDrSjgL5URO7_PHIRst+Z*RO zRpZ3Q?H~~+_av^Yp$4bl-^dI-vo8JImuGqgaReSKVSy*nt9G$=>(k%+ZeJqbRKnhE z?Vg!-YY?{+X3CBdW!xB6?dr$ThL}f@=ka$hV(p{g1I%)Y_-W>S313dwvy%&K@5SbO zj@f+HcY@zz%yQz>SnQ2lNLkAuu~A={S8VUB`54hBnMV=VIh*hc=-RFGRMO3>-MlX& zj=*mgXy-5Uy@ftn;L%5x;w1Taf*&!VAjw0i;@gE z`zH3R9oj!+HrAZl#h$%f^m%Fz_UyIC{(SR{Yv;&f?F)!pNcepLmt{M`6-zxDH>T@1Oyw}62ch8{PTYIeSD!XzI@)2_gT`uqubl*bccosc! zXd7lF*E*W`8D?|nXMTI4ZHmr$pI=0L1KxAj@NU0^$j6$#edF#BQ@*A0djPe|jiJZ4 zHT=#b&U0I&D$jKs8AbHh?)&+JyxLwtTw9;W@oM6kcDdIQ=f1=5^~9BHm3Q+EIOFx# z9{ZPf|GvMs5%=c1bieLz0+IhM?f0F;`L-kOJbJ{LSFE2oe19JxzP;$-C3O8`jmzl1 zy$7i;AEO(ipZn5oUhk~7$a59Fdj8kI`g@188RNZ{kCD_3kdK&K=ndqTbl*Qkmkax6h5qD@&VkKo4t=$o*LSAPIPb+GVjmWG z<@=fMBu?I8jse8;(ta0NK=d=;eBz>x&%yR6@O|_K@@G2lC3Jn{eNWzr2Z-xh} zyFS+9H%Knl?x5R`z$@t1E4J6GNVV6G5-0DlrfRQqusQVmHTB~$y6b3*b$&p%mhf3a r*H1p)a2H+P5nK;l&UJ(9C(b(JyRwdMy#Ct#KjZ$}%-a4V!zJW@j$gIi literal 2736 zcmZ9NTXR%J6h_;GNkC!%k(<{EsHkAP0ip;@h!W8d0>Pl7!jPGSqmvmb7kxB7_-d6^ z{vWISRlZo|T0Om~Q=F=u-ru*c-MxDrKi$(+MRl7_#H?iFe&X#V|ksMUz(rZ z-0Do9Is2|2lW8a#CRq+P7adb{dt*o*8(jv!}|PmmUJ57|$wz7$0prBX`&kf;G$ z&(XlP2iwZEq0O9Ce{rzMs%=u+E%ipORrMDJ8|&@7g$8|FyXs%-|9pMW>GqbZ?k~eU zZyPu04K{L~vGgA6W_$fnue&i@=$zBOtN#3;bERrW>>zIc_vvV4cr;BkvF2YVG0H za(89e-(_se#ol7A`u32`x&K)>+DG4&K4)#OKd8F>t&FYFsa99FH@mqP^K3rqu59<( zwhcFy&vLN6b#%=Ga9>m_2*mDs#3U>d;5kKwXDJ1+o2mQS#?cSx> zyArnwb|S>yv39?ML>V`gZ+e*HF!~r=6FGvvb09Xp3Es^rr-+|swHNV)g59HBVD~6C z-*c?yv%jPKJ;W*}Hs4`ZedUc8dnR(Hz{Wn0_yvA7qn*DGVSf$1neosre!XDxpG3D; z^N3FuY!Ann=;>l}zxB`helKtm@387;e134~a`r3sj{LNrVKvrz+Qr_PT%3=0R>!S^ zV}Cp`zssk|V((udav|Zj1eemzW53%VxsdR?t6SQcvA-YC+^hSyAF(qccaAA^KD--0 zxqo4tO?{n(JxJWWc(R5)Ti}+kK05>{}FHq(9dQ#Ce=3 zXZH-cXZ=~`Qo6*h+=G0?>_e9ed;r}UjvUXTM-FWhRI=8=!q2gqLqGF-CfdyBTpvZ8 z>BxT!U7wrzm%|xz7KdMOFBZwId9JRhOg@A_k~{?3awW1M06 zh`EUF8;<$7gdQ>4jB(E8BW4D@g+$C1^oY@BjBi0cVm?JT&#z^+?MW`|SJCY)=FvGc zr>nl&&Fh30{2UcN_n@A}w_zc+GG`#!qo5x9+Rzhck&0a8EfmBPvUJ$cq0ICJRt zTRD#|`h7%O)LBKhm+)Cb*H1p)^+R-dzu+o#IqL@ZW8u8>_+9x4-FW@AFCp >$h I$Z#I{ADo|_od5s; diff --git a/data/shaders/texturecubemap/reflect.vert b/data/shaders/texturecubemap/reflect.vert index 3017f3d4..1da8c387 100644 --- a/data/shaders/texturecubemap/reflect.vert +++ b/data/shaders/texturecubemap/reflect.vert @@ -3,10 +3,11 @@ layout (location = 0) in vec3 inPos; layout (location = 1) in vec3 inNormal; -layout (binding = 0) uniform UBO +layout (binding = 0) uniform UBO { mat4 projection; mat4 model; + mat4 invModel; float lodBias; } ubo; @@ -15,24 +16,21 @@ layout (location = 1) out vec3 outNormal; layout (location = 2) out float outLodBias; layout (location = 3) out vec3 outViewVec; layout (location = 4) out vec3 outLightVec; -layout (location = 5) out mat4 outInvModelView; -out gl_PerVertex +out gl_PerVertex { vec4 gl_Position; }; -void main() +void main() { gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); - + outPos = vec3(ubo.model * vec4(inPos, 1.0)); - outNormal = mat3(ubo.model) * inNormal; + outNormal = mat3(ubo.model) * inNormal; outLodBias = ubo.lodBias; - - outInvModelView = inverse(ubo.model); vec3 lightPos = vec3(0.0f, -5.0f, 5.0f); outLightVec = lightPos.xyz - outPos.xyz; - outViewVec = -outPos.xyz; + outViewVec = -outPos.xyz; } diff --git a/data/shaders/texturecubemap/reflect.vert.spv b/data/shaders/texturecubemap/reflect.vert.spv index 9c7c86ad28beaee607ad4d7c206f4b9858864024..ebceaeaef4a44aa9c057204b01b554bfddfe3ea5 100644 GIT binary patch delta 496 zcmZ8e%}T>S82mQdO}#{{r67nuP(?(qq97Ha;8txlD)<6gv>^7<2t7sU6NJTsHw*d% zJ$dWZ_wY3YXVOH9DbxLCzM1b^lK1lWe4xE*QAEiMepgAbqk^QqX__JuCeh1^FS95; zp!4|D>fW{=P>L@m)wL_BNE@+ksLB2v$xx4ROw{PGv61p!nw1vMZ2A)Qi=F}?i z{7=JuWNu2+sOcNKzBedw%Q8>^EdE2cq+g4Zdj_LVy{KXaR?({Csir0oX#H zdIR8-^W&7gjdOl7;fLFBGj|FwLmzwln6rkH*WzAqKNUjPHyeg4?dZeo>i7VC3(5&K wq&Tg`_7p!uy$%fUir7B~=%LO$w@}OT7pUovvw4@OsnHwaB>%zJ-4mtc7mDmLmjD0& delta 516 zcmX|7%Sr=55bW8fk!(QsA_T-&5K-|Y3ZfVUHJWImZuA2T8VD|8q8DKmzhD_Wco7A! zf|4Kb;)ewMjeu2a;x0vZRabY<%+K(f@0rG=E26}e0Xd1iMU{y+W>Q-sQUQYa^3k;= zgVfMD)mm_brLfg3TwIsJ(^{iiuic1^zX-iiKRa)h!z-kTR?(lzSAqUkulm_=^sSNB zAI9A{XN)Eu!8|KjMQ#D)fzF#xCib>FW>zUfcdcw>qUZrDFl;795o%-LyNI}ki~zIX z4q^%5*XMf)d->|~{Xf1w2RHl50DI_TjeDjL`3~4K_%8(d-k!F(vedpXbup`yExJ^@C( setLayoutBindings = { - // Binding 0 : Vertex shader uniform buffer + // Binding 0 : Uniform buffer vks::initializers::descriptorSetLayoutBinding( VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_SHADER_STAGE_VERTEX_BIT, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0), // Binding 1 : Fragment shader image sampler vks::initializers::descriptorSetLayoutBinding( @@ -620,7 +621,7 @@ public: // Prepare and initialize uniform buffer containing shader uniforms void prepareUniformBuffers() { - // Objact vertex shader uniform buffer + // Object vertex shader uniform buffer VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, @@ -646,6 +647,7 @@ public: // 3D object uboVS.projection = camera.matrices.perspective; uboVS.modelView = camera.matrices.view; + uboVS.inverseModelview = glm::inverse(camera.matrices.view); memcpy(uniformBuffers.object.mapped, &uboVS, sizeof(uboVS)); // Skybox uboVS.modelView = camera.matrices.view;