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 badefb38..9e5a3629 100644 Binary files a/data/shaders/texturecubemap/reflect.frag.spv and b/data/shaders/texturecubemap/reflect.frag.spv differ 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 9c7c86ad..ebceaeae 100644 Binary files a/data/shaders/texturecubemap/reflect.vert.spv and b/data/shaders/texturecubemap/reflect.vert.spv differ diff --git a/data/shaders/texturecubemap/skybox.frag.spv b/data/shaders/texturecubemap/skybox.frag.spv index 54a894cc..87e4fe98 100644 Binary files a/data/shaders/texturecubemap/skybox.frag.spv and b/data/shaders/texturecubemap/skybox.frag.spv differ diff --git a/data/shaders/texturecubemap/skybox.vert.spv b/data/shaders/texturecubemap/skybox.vert.spv index 52290c71..c823cbb3 100644 Binary files a/data/shaders/texturecubemap/skybox.vert.spv and b/data/shaders/texturecubemap/skybox.vert.spv differ diff --git a/examples/texturecubemap/texturecubemap.cpp b/examples/texturecubemap/texturecubemap.cpp index 2a77ba66..6ae3eb24 100644 --- a/examples/texturecubemap/texturecubemap.cpp +++ b/examples/texturecubemap/texturecubemap.cpp @@ -55,6 +55,7 @@ public: struct UBOVS { glm::mat4 projection; glm::mat4 modelView; + glm::mat4 inverseModelview; float lodBias = 0.0f; } uboVS; @@ -440,10 +441,10 @@ public: { std::vector 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;