Added normal maapping + material preview widget

This commit is contained in:
antopilo
2025-04-25 20:22:41 -04:00
parent 30b5ccc339
commit 67916d0307
18 changed files with 1005 additions and 218 deletions

View File

@@ -13,8 +13,8 @@ struct Vertex
float uv_x;
float3 normal;
float uv_y;
float3 tangent;
float3 bitangent;
float4 tangent;
float4 bitangent;
};
[[vk::binding(0, 1)]]
@@ -86,7 +86,8 @@ struct PSInput
float3 Color : TEXCOORD0;
float2 UV : TEXCOORD1;
float3 Normal : TEXCOORD2;
//float3x3 TBN : TEXCOORD3;
float3 Tangent : TEXCOORD3;
float3 Bitangent : TEXCOORD4;
};
struct PSOutput {
@@ -107,6 +108,8 @@ struct ModelPushConstant
[[vk::push_constant]]
ModelPushConstant pushConstants;
PSOutput main(PSInput input)
{
PSOutput output;
@@ -114,13 +117,26 @@ PSOutput main(PSInput input)
Material inMaterial = material[pushConstants.materialIndex];
// NORMAL
// TODO use TBN matrix
float3 normal = float3(0.5, 0.5, 1.0);
float3 T = input.Tangent.xyz;
float3 B = input.Bitangent.xyz;
float3 N = input.Normal.xyz;
float3x3 TBN = float3x3(T, B, N);
float3 normal = float3(0.0, 0.0, 1.0);
if(inMaterial.hasNormal == 1)
{
// Sample from texture.
normal = textures[inMaterial.normalTextureId].Sample(mySampler, input.UV).rgb;
normal.xyz = normal.zxy;
normal = normal * 2.0f - 1.0f;
}
//normal = mul(input.TBN, normal);
normal = input.Normal / 2.0f + 0.5f;
else
{
normal = normal;
}
//normal = input.Normal;
normal = mul(transpose(TBN), normal);
normal = normal / 2.0f + 0.5f;
output.oNormal = float4(normal, 1.0f);
// MATERIAL

View File

@@ -13,8 +13,8 @@ struct Vertex
float uv_x;
float3 normal;
float uv_y;
float3 tangent;
float3 bitangent;
float4 tangent;
float4 bitangent;
};
[[vk::binding(0, 1)]]
@@ -98,9 +98,35 @@ struct VSOutput
float3 Color : TEXCOORD0;
float2 UV : TEXCOORD1;
float3 Normal : TEXCOORD2;
//float3x3 TBN : TEXCOORD3;
float3 Tangent : TEXCOORD3;
float3 Bitangent : TEXCOORD4;
};
float3x3 invert(float3x3 m)
{
float3 a = m[0];
float3 b = m[1];
float3 c = m[2];
float3 r0 = cross(b, c);
float3 r1 = cross(c, a);
float3 r2 = cross(a, b);
float det = dot(r2, c);
// Return identity if not invertible (optional fallback)
if (abs(det) < 1e-6)
return float3x3(1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0);
float invDet = 1.0 / det;
return float3x3(r0 * invDet,
r1 * invDet,
r2 * invDet);
}
// Main vertex shader
VSOutput main(uint vertexIndex : SV_VertexID)
{
@@ -116,11 +142,13 @@ VSOutput main(uint vertexIndex : SV_VertexID)
output.Position = mul(camView.Projection, mul(camView.View, mul(modelData.model, float4(v.position, 1.0f))));
output.Color = normalize(float3(v.position.xyz));
output.UV = float2(v.uv_x, v.uv_y);
output.Normal = normalize(v.normal);
float3x3 upper3x3 = (float3x3)modelData.model;
float3x3 normalMatrix = transpose(invert(upper3x3));
output.Bitangent = mul(normalMatrix, normalize(v.bitangent.xyz));
output.Normal = mul(normalMatrix, normalize(v.normal.xyz));
output.Tangent = mul(normalMatrix, normalize(v.tangent.xyz));
//float3 T = normalize(mul((float3x3)modelData.model, normalize(v.tangent.xyz)));
//float3 B = normalize(mul((float3x3)modelData.model, normalize(v.bitangent.xyz)));
//float3 N = normalize(mul((float3x3)modelData.model, normalize(v.normal)).xyz);
//output.TBN = transpose(float3x3(T, B, N));
//output.Normal = v.normal.xyz;
return output;
}