Add inverseModelView UBO to fix texturecubemap sample
This commit is contained in:
parent
13c081664e
commit
e3234db041
11 changed files with 42 additions and 25 deletions
|
|
@ -78,7 +78,7 @@ Shaders written to mirror the GLSL versions at `eddd724`. There have been change
|
||||||
| texture | ☑ | ☑ | ☑ | ☑
|
| texture | ☑ | ☑ | ☑ | ☑
|
||||||
| texture3d | ☑ | ☑ | ☑ | ☑
|
| texture3d | ☑ | ☑ | ☑ | ☑
|
||||||
| texturearray | ☑ | ☑ | ☑ | ☑
|
| texturearray | ☑ | ☑ | ☑ | ☑
|
||||||
| texturecubemap | ☑ | ❌ | ☑ | ❌
|
| texturecubemap | ☑ | ❌ | ☑ | ☑
|
||||||
| texturemipmapgen | ☑ | ☑ | ☑ | ☑
|
| texturemipmapgen | ☑ | ☑ | ☑ | ☑
|
||||||
| texturesparseresidency | ☑ | ☑ | ☑ | ☑
|
| texturesparseresidency | ☑ | ☑ | ☑ | ☑
|
||||||
| triangle | ☑ | ☑ | ☑ | ☑
|
| triangle | ☑ | ☑ | ☑ | ☑
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,16 @@
|
||||||
TextureCube textureColor : register(t1);
|
TextureCube textureColor : register(t1);
|
||||||
SamplerState samplerColor : register(s1);
|
SamplerState samplerColor : register(s1);
|
||||||
|
|
||||||
|
struct UBO
|
||||||
|
{
|
||||||
|
float4x4 projection;
|
||||||
|
float4x4 model;
|
||||||
|
float4x4 invModel;
|
||||||
|
float lodBias;
|
||||||
|
};
|
||||||
|
|
||||||
|
cbuffer ubo : register(b0) { UBO ubo; }
|
||||||
|
|
||||||
struct VSOutput
|
struct VSOutput
|
||||||
{
|
{
|
||||||
[[vk::location(0)]] float3 Pos : POSITION0;
|
[[vk::location(0)]] float3 Pos : POSITION0;
|
||||||
|
|
@ -16,7 +26,9 @@ float4 main(VSOutput input) : SV_TARGET
|
||||||
{
|
{
|
||||||
float3 cI = normalize (input.ViewVec);
|
float3 cI = normalize (input.ViewVec);
|
||||||
float3 cR = reflect (cI, normalize(input.Normal));
|
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);
|
float4 color = textureColor.SampleLevel(samplerColor, cR, input.LodBias);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,8 @@ struct VSInput
|
||||||
struct UBO
|
struct UBO
|
||||||
{
|
{
|
||||||
float4x4 projection;
|
float4x4 projection;
|
||||||
float4x4 view;
|
|
||||||
float4x4 model;
|
float4x4 model;
|
||||||
float3 camPos;
|
float4x4 invModel;
|
||||||
float lodBias;
|
float lodBias;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -30,14 +29,14 @@ struct VSOutput
|
||||||
VSOutput main(VSInput input)
|
VSOutput main(VSInput input)
|
||||||
{
|
{
|
||||||
VSOutput output = (VSOutput)0;
|
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.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;
|
output.LodBias = ubo.lodBias;
|
||||||
|
|
||||||
float3 lightPos = float3(0.0f, -5.0f, 5.0f);
|
float3 lightPos = float3(0.0f, -5.0f, 5.0f);
|
||||||
output.LightVec = lightPos.xyz - output.WorldPos.xyz;
|
output.LightVec = lightPos.xyz - output.WorldPos.xyz;
|
||||||
output.ViewVec = output.WorldPos - ubo.camPos;
|
output.ViewVec = -output.WorldPos;
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
struct UBO
|
struct UBO
|
||||||
{
|
{
|
||||||
float4x4 projection;
|
float4x4 projection;
|
||||||
float4x4 view;
|
|
||||||
float4x4 model;
|
float4x4 model;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -20,6 +19,6 @@ VSOutput main([[vk::location(0)]] float3 Pos : POSITION0)
|
||||||
VSOutput output = (VSOutput)0;
|
VSOutput output = (VSOutput)0;
|
||||||
output.UVW = Pos;
|
output.UVW = Pos;
|
||||||
output.UVW.x *= -1.0;
|
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;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,19 @@
|
||||||
|
|
||||||
layout (binding = 1) uniform samplerCube samplerColor;
|
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 = 0) in vec3 inPos;
|
||||||
layout (location = 1) in vec3 inNormal;
|
layout (location = 1) in vec3 inNormal;
|
||||||
layout (location = 2) in float inLodBias;
|
layout (location = 2) in float inLodBias;
|
||||||
layout (location = 3) in vec3 inViewVec;
|
layout (location = 3) in vec3 inViewVec;
|
||||||
layout (location = 4) in vec3 inLightVec;
|
layout (location = 4) in vec3 inLightVec;
|
||||||
layout (location = 5) in mat4 inInvModelView;
|
|
||||||
|
|
||||||
layout (location = 0) out vec4 outFragColor;
|
layout (location = 0) out vec4 outFragColor;
|
||||||
|
|
||||||
|
|
@ -16,7 +23,7 @@ void main()
|
||||||
vec3 cI = normalize (inPos);
|
vec3 cI = normalize (inPos);
|
||||||
vec3 cR = reflect (cI, normalize(inNormal));
|
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;
|
cR.x *= -1.0;
|
||||||
|
|
||||||
vec4 color = texture(samplerColor, cR, inLodBias);
|
vec4 color = texture(samplerColor, cR, inLodBias);
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -7,6 +7,7 @@ layout (binding = 0) uniform UBO
|
||||||
{
|
{
|
||||||
mat4 projection;
|
mat4 projection;
|
||||||
mat4 model;
|
mat4 model;
|
||||||
|
mat4 invModel;
|
||||||
float lodBias;
|
float lodBias;
|
||||||
} ubo;
|
} ubo;
|
||||||
|
|
||||||
|
|
@ -15,7 +16,6 @@ layout (location = 1) out vec3 outNormal;
|
||||||
layout (location = 2) out float outLodBias;
|
layout (location = 2) out float outLodBias;
|
||||||
layout (location = 3) out vec3 outViewVec;
|
layout (location = 3) out vec3 outViewVec;
|
||||||
layout (location = 4) out vec3 outLightVec;
|
layout (location = 4) out vec3 outLightVec;
|
||||||
layout (location = 5) out mat4 outInvModelView;
|
|
||||||
|
|
||||||
out gl_PerVertex
|
out gl_PerVertex
|
||||||
{
|
{
|
||||||
|
|
@ -30,8 +30,6 @@ void main()
|
||||||
outNormal = mat3(ubo.model) * inNormal;
|
outNormal = mat3(ubo.model) * inNormal;
|
||||||
outLodBias = ubo.lodBias;
|
outLodBias = ubo.lodBias;
|
||||||
|
|
||||||
outInvModelView = inverse(ubo.model);
|
|
||||||
|
|
||||||
vec3 lightPos = vec3(0.0f, -5.0f, 5.0f);
|
vec3 lightPos = vec3(0.0f, -5.0f, 5.0f);
|
||||||
outLightVec = lightPos.xyz - outPos.xyz;
|
outLightVec = lightPos.xyz - outPos.xyz;
|
||||||
outViewVec = -outPos.xyz;
|
outViewVec = -outPos.xyz;
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -55,6 +55,7 @@ public:
|
||||||
struct UBOVS {
|
struct UBOVS {
|
||||||
glm::mat4 projection;
|
glm::mat4 projection;
|
||||||
glm::mat4 modelView;
|
glm::mat4 modelView;
|
||||||
|
glm::mat4 inverseModelview;
|
||||||
float lodBias = 0.0f;
|
float lodBias = 0.0f;
|
||||||
} uboVS;
|
} uboVS;
|
||||||
|
|
||||||
|
|
@ -440,10 +441,10 @@ public:
|
||||||
{
|
{
|
||||||
std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings =
|
std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings =
|
||||||
{
|
{
|
||||||
// Binding 0 : Vertex shader uniform buffer
|
// Binding 0 : Uniform buffer
|
||||||
vks::initializers::descriptorSetLayoutBinding(
|
vks::initializers::descriptorSetLayoutBinding(
|
||||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||||
VK_SHADER_STAGE_VERTEX_BIT,
|
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
0),
|
0),
|
||||||
// Binding 1 : Fragment shader image sampler
|
// Binding 1 : Fragment shader image sampler
|
||||||
vks::initializers::descriptorSetLayoutBinding(
|
vks::initializers::descriptorSetLayoutBinding(
|
||||||
|
|
@ -620,7 +621,7 @@ public:
|
||||||
// Prepare and initialize uniform buffer containing shader uniforms
|
// Prepare and initialize uniform buffer containing shader uniforms
|
||||||
void prepareUniformBuffers()
|
void prepareUniformBuffers()
|
||||||
{
|
{
|
||||||
// Objact vertex shader uniform buffer
|
// Object vertex shader uniform buffer
|
||||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(
|
VK_CHECK_RESULT(vulkanDevice->createBuffer(
|
||||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
||||||
|
|
@ -646,6 +647,7 @@ public:
|
||||||
// 3D object
|
// 3D object
|
||||||
uboVS.projection = camera.matrices.perspective;
|
uboVS.projection = camera.matrices.perspective;
|
||||||
uboVS.modelView = camera.matrices.view;
|
uboVS.modelView = camera.matrices.view;
|
||||||
|
uboVS.inverseModelview = glm::inverse(camera.matrices.view);
|
||||||
memcpy(uniformBuffers.object.mapped, &uboVS, sizeof(uboVS));
|
memcpy(uniformBuffers.object.mapped, &uboVS, sizeof(uboVS));
|
||||||
// Skybox
|
// Skybox
|
||||||
uboVS.modelView = camera.matrices.view;
|
uboVS.modelView = camera.matrices.view;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue