From 0f8a349f0cc18ef776bbcc16281e1dc3b7cfa77b Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Wed, 3 Aug 2022 20:11:40 +0200 Subject: [PATCH] Get sampler index from UBO instead of passing from VS to FS Fixes #826 --- .../glsl/texturemipmapgen/texture.frag | 19 +++++++++++----- .../glsl/texturemipmapgen/texture.vert | 13 +++-------- .../hlsl/texturemipmapgen/texture.frag | 21 +++++++++++++----- .../hlsl/texturemipmapgen/texture.frag.spv | Bin 3064 -> 2520 bytes .../hlsl/texturemipmapgen/texture.vert | 8 +++---- .../hlsl/texturemipmapgen/texture.vert.spv | Bin 4204 -> 2476 bytes .../texturemipmapgen/texturemipmapgen.cpp | 2 +- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/data/shaders/glsl/texturemipmapgen/texture.frag b/data/shaders/glsl/texturemipmapgen/texture.frag index edb92b59..3717d5ec 100644 --- a/data/shaders/glsl/texturemipmapgen/texture.frag +++ b/data/shaders/glsl/texturemipmapgen/texture.frag @@ -5,16 +5,25 @@ layout (set = 0, binding = 2) uniform sampler samplers[3]; layout (location = 0) in vec2 inUV; layout (location = 1) in float inLodBias; -layout (location = 2) flat in int inSamplerIndex; -layout (location = 3) in vec3 inNormal; -layout (location = 4) in vec3 inViewVec; -layout (location = 5) in vec3 inLightVec; +layout (location = 2) in vec3 inNormal; +layout (location = 3) in vec3 inViewVec; +layout (location = 4) in vec3 inLightVec; + +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 view; + mat4 model; + vec4 viewPos; + float lodBias; + int samplerIndex; +} ubo; layout (location = 0) out vec4 outFragColor; void main() { - vec4 color = texture(sampler2D(textureColor, samplers[inSamplerIndex]), inUV, inLodBias); + vec4 color = texture(sampler2D(textureColor, samplers[uniform.samplerIndex]), inUV, inLodBias); vec3 N = normalize(inNormal); vec3 L = normalize(inLightVec); diff --git a/data/shaders/glsl/texturemipmapgen/texture.vert b/data/shaders/glsl/texturemipmapgen/texture.vert index 55770880..5d04b795 100644 --- a/data/shaders/glsl/texturemipmapgen/texture.vert +++ b/data/shaders/glsl/texturemipmapgen/texture.vert @@ -16,21 +16,14 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; layout (location = 1) out float outLodBias; -layout (location = 2) flat out int outSamplerIndex; -layout (location = 3) out vec3 outNormal; -layout (location = 4) out vec3 outViewVec; -layout (location = 5) out vec3 outLightVec; - -out gl_PerVertex -{ - vec4 gl_Position; -}; +layout (location = 2) out vec3 outNormal; +layout (location = 3) out vec3 outViewVec; +layout (location = 4) out vec3 outLightVec; void main() { outUV = inUV * vec2(2.0, 1.0); outLodBias = ubo.lodBias; - outSamplerIndex = ubo.samplerIndex; vec3 worldPos = vec3(ubo.model * vec4(inPos, 1.0)); diff --git a/data/shaders/hlsl/texturemipmapgen/texture.frag b/data/shaders/hlsl/texturemipmapgen/texture.frag index 9f58e19d..b14d63d1 100644 --- a/data/shaders/hlsl/texturemipmapgen/texture.frag +++ b/data/shaders/hlsl/texturemipmapgen/texture.frag @@ -3,19 +3,30 @@ Texture2D textureColor : register(t1); SamplerState samplers[3] : register(s2); +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; + float4 viewPos; + float lodBias; + int samplerIndex; +}; + +cbuffer ubo : register(b0) { UBO ubo; } + struct VSOutput { [[vk::location(0)]] float2 UV : TEXCOORD0; [[vk::location(1)]] float LodBias : TEXCOORD3; -[[vk::location(2)]] int SamplerIndex : TEXCOORD4; -[[vk::location(3)]] float3 Normal : NORMAL0; -[[vk::location(4)]] float3 ViewVec : TEXCOORD1; -[[vk::location(5)]] float3 LightVec : TEXCOORD2; +[[vk::location(2)]] float3 Normal : NORMAL0; +[[vk::location(3)]] float3 ViewVec : TEXCOORD1; +[[vk::location(4)]] float3 LightVec : TEXCOORD2; }; float4 main(VSOutput input) : SV_TARGET { - float4 color = textureColor.Sample(samplers[input.SamplerIndex], input.UV, int2(0, 0), input.LodBias); + float4 color = textureColor.Sample(samplers[ubo.samplerIndex], input.UV, int2(0, 0), input.LodBias); float3 N = normalize(input.Normal); float3 L = normalize(input.LightVec); diff --git a/data/shaders/hlsl/texturemipmapgen/texture.frag.spv b/data/shaders/hlsl/texturemipmapgen/texture.frag.spv index 89a191605803fc93bcf1b4422f94dc211a5a77aa..838dd55024c45d3ba5af262eeb13eb5ada8bec46 100644 GIT binary patch literal 2520 zcmZ9N$x>566o#9`Bn}a9o)8mMoG{Mw0AVnw(IDcmv!c0Lu>zM$g2RrDRjyq5Kt6&C zAI6PU{$HmLUenY`_y3=v&pF+FNvDqHoEvb?4Z6qrW$bV%&oG}B-sZ9%SE^5|rB1g| zx_sq4c7ra>INt?<#O?piyViCb}7(DU2ivG3HES6flwGcGSaP@SG_#%(v-wbwCRR@uQZ zpfbv3Q0r&YHR-Z`jc&CazmMK@o3X0O$_g7g_MsVlL~oq0J#Iv;1V<0BTZlUwcJ!nb zH>R6)xSWqi4?@28R~peLL7&f%=3Z_&W#?RTrSzfRE-lTyoT=3oXZ<;36oZ(3x=W&b zkBA*~k86vM%2j#c!@h4p zaXuS|T9GaFj7k__Y5>z)FnNQC2_|1Keqino7(Xz1ff-=#%$P_2a8cOeb4QYTFnZgM z-Y4~7^o)6B$30*i?M?r2ouTEV3y6S@)L0}^aZ%yh~P=8rg^zDj-db#_&8|>)gRSCMXqSMc768Z#>4ZXcC zfqyO=dVE7deE1itk~6z0fv1kI65bj$=y|K(WKXQJgf~4Uu^7`@vj_WIj2W#h272DN>1KnD zxY+U5pM-p(Ln5QcA-NsPvXMS@8X6Ho++gCd}o3Kb!hqAD^miKE}F(F{0M*(#YRxW)x{ zal?JXec%3_U##+Z?wr=CIaG7{eY;P0pFTY|9qqfjv#c%4vcBvu{&#K8+H=PJM(`C` zSB@vAW~Yj4_4(qV!#C^Kmvy-1w*IU)>qKuy7Av(Sd988UT7OIIaP&j!; zm#NyBN9&R--{}DRN@caOnBSnbWNG$e2EOT?{(IcX^!|O=C#m1uI}w-IykhSlHmBJ7 z#m<)4b7K20_MF&Wi#;c{zhalzxpIbFfk)9JpL5h~7i%~FHqQ65k0AQ*Px#6f?A`Pa zdq28sJN}#4jiG&vD#e=-eUvz}1>HLa-iq#>0$+vhod@vR#y)~*Qy)OGY~z^uwxh`z zYmDxRuSWChIRL_QAWv61zsoy`!Nf-_E?ok;EBO zeH5{_A)@SJ-vNIuySg^x#QVv6r|a0wZC>rW+1n6#@%0JoBi@s6}2FS|9#ZzYT0#Zj33?CLw2GJkhbhjAOR8oM!Wf^#4)Pqg4CTkumY_~{n> zOcS=R&o*K6Z8Txu=Rm@Dliz;&N5k61zK0)n`y=)}{FvJxvG3;}68jU_KOWvE@L_cO zGfh{Vk0XdVjB6~ry+&m(evcZ_LGFCg+_-~C0zH}{OQa~|=G-zI&m z`z1tPALr?1#JP~y$Ju%Xk=Lih{wiXeencPp^BN*w#>csP9WlRWAK<3@*xx|p^_BOV zXU*Qv_ttI>-}_C(99s}`*wYJ$d~f=Oy@l?4O(5EgSl;=*ABGA-Xm9G9BLWBg7b!h`!p5 z<2-ANb04F7F7PMl#=S`YoP|#jedLWT_ZedBy@>WfD2Plz$}Gln(%jF@LS&EGGHlUJTgXMaWa zy!QK2y}zN$yMp^2UC!LW{gF6pndaTB{ZGX6`fDFRyz>UTwz%VM=yKY6*v0=4{dVME D>{sx< diff --git a/data/shaders/hlsl/texturemipmapgen/texture.vert b/data/shaders/hlsl/texturemipmapgen/texture.vert index 8b5f3036..6bcd982d 100644 --- a/data/shaders/hlsl/texturemipmapgen/texture.vert +++ b/data/shaders/hlsl/texturemipmapgen/texture.vert @@ -24,10 +24,9 @@ struct VSOutput float4 Pos : SV_POSITION; [[vk::location(0)]] float2 UV : TEXCOORD0; [[vk::location(1)]] float LodBias : TEXCOORD3; -[[vk::location(2)]] int SamplerIndex : TEXCOORD4; -[[vk::location(3)]] float3 Normal : NORMAL0; -[[vk::location(4)]] float3 ViewVec : TEXCOORD1; -[[vk::location(5)]] float3 LightVec : TEXCOORD2; +[[vk::location(2)]] float3 Normal : NORMAL0; +[[vk::location(3)]] float3 ViewVec : TEXCOORD1; +[[vk::location(4)]] float3 LightVec : TEXCOORD2; }; VSOutput main(VSInput input) @@ -35,7 +34,6 @@ VSOutput main(VSInput input) VSOutput output = (VSOutput)0; output.UV = input.UV * float2(2.0, 1.0); output.LodBias = ubo.lodBias; - output.SamplerIndex = ubo.samplerIndex; float3 worldPos = mul(ubo.model, float4(input.Pos, 1.0)).xyz; diff --git a/data/shaders/hlsl/texturemipmapgen/texture.vert.spv b/data/shaders/hlsl/texturemipmapgen/texture.vert.spv index de4cb54486f9eb5d6da2507997ff422fb91d7abb..cbfc816b9fdae8355ee1ae64995fbc0815b1881a 100644 GIT binary patch literal 2476 zcmZ9N*-}$M5QYarh&v*(xM4!v!3ZvhA`mu16gUyF%G)5hhy@&qO}(Sa^4>?%H}Jv- z@zNWs{J+Vx9x_xr{r|m8cb}PX3+5XPNLYq*4d@nB zE%$+yZ)`_6&OR$yP#*Imuf@>=am6OCIS#*M9K8~ED6w2{&2ezaIC>=Ro5bR-dUaZdb})It^bf`t+!=66d$;g8?O6#u4hGznz{H-H zXce)8yFEOd8q)m9-y^{X-g5Lxrv}4)(piQtNT(*l7o}4Zm@_U(ocs0N@MVvk8`2G< zhbt0%;E_JXac}6KbNlsD_~vjXHXC~G4>QCktB9-GsfW3Ov)Y*nXMuA8(=T{HJN1$i z%(nrX{aV2Eg8h2HqqnEL7Oj&|ZX2me9s_*28UFg@^I z;K13Sw*;KiPORaqbY^9kp16DX5TDo1dp1l@+;PM7#CuL+-g6Q+{x5KDRGI0Mvsm=~ zTa^xJpU_$Kbyq^|VCGnmkjw1%q*L#gaPNkt6c=5_p6~e)3t(s!Nylb>6A3@wviVJV{eKNp!kh(fbrq$vnqVsmB6PtWHwf64U;?$*0g~F6Vp)jlPC%;|I zg{g@tW?1WNeq8E9gVka6sfZpWqycF}NLHAJOh-;ZW*|j=wC^OKfuEV^1AXQ3v61mH zRN_h*r`}uJJBdAO$AI>U7|-jj?e3@!>eH0Pcz)mD(8!+3XxH%W%FVz@f9vY0jSda& z`H!=Xfof&{KxG$xjad%s?ylZ&XAKzJ%vqm|WR0BONMc>g;&hn_c zMn-ElRd$V4YfQ+xJ?zQ#Y(9I~Ti3JooC-ft zTT^y7)#3JigQM-e<-V@|u5!;x%)~a~Stul1|JB!BRW5Jel5BQ4Y3nI(zh-kc7Gs=I zZG0?Cm=DtCo!8qgfz#$&sJC63*&4Gq61F(Z7~f6san`Do&-YYsTbk?a|*mn_cH*g!AYb##9DOc=y z&RXUmTgel4&j}xUlHXLv)yL_VkF$5<4j_?Bu0BpKA6En$cMOR*?Q$n_oW0APOxzN7 zmz>KxlQaK(biZz`$O2CD9>wMr+rL=fdEjRDR>YpPpT@4eh_vvk{l1wa;`G-iq#aLv z<{}rSe5a$EPi(Gv2y0W|`58R0aRv8f-UWz0@{wa9x-|zr1Kkz)Omuq)ya?Sn1wISi z9>msgHc}}3bv&?d%C&+QYcGotedLwM(~9n!UPzv0?9RfvTKFq*{&FEPYiHEL>E4Mx ztwgl3Td$n>9Cl~q+2V5(b{^v8?AC8i@p%b{{rrUOP5T82PuypT`X}PeKbMnNu(y%% zB6jr_rnQn?yE&tdi_v|z+Syh~4wGuLHNS`wfv3dk^YU680X94XnMC z!^_cqXZjfLz4$%?doR`#*n9Dt7ub98o0rFa^YYklo_Gx>c~{or^6vho+IDu&?qI(I z@jS72ac3PqoWuGb$zktwRl@6ucW$c@=OOkE{oiLTVfX)?^XR2(-^gW%G5TrSfVVm2 z)veEO!)AKvWWNj1?l&UNxI6K;;p3V2AaZ^eBJN&va~Wq|v3}ZpWA`E6tKSJZ-`V|$ zyx$Vf@{Juul1k&MbGE;T|b7%TZ?&@u|JN;8@Gl13B>u?r#{}2^ZcQ=wG^Ch~x z;))o*KL^2IA=YAUed7+lM)wY*FW>4nh`citpGcfJBJNvsXXrP>8H)8&Kg_-uiNCw= z(0${9zem^S)|CGwx<2xe{|9vQw<6{g>lb(QBYOUh4uO9{j&5y>5Ni|bXO5Zde<0em9Z5KBYrt}G|7+3ZT>3Y#%W0p( zemSDuI<+?@PWx>1D-i9z1?^3V)834}4$)pjv` setLayoutBindings = { // Binding 0: Vertex shader uniform buffer - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0), // Binding 1: Sampled image vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_SHADER_STAGE_FRAGMENT_BIT, 1), // Binding 2: Sampler array (3 descriptors)