mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-21 20:08:40 +03:00
Added normal maapping + material preview widget
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user