我开始使用“实例化模型”技术来绘制场景,但法线的顶点有问题
我给 HLSL 矩阵(旋转/缩放/位置)以绘制模型的每个实例,但旋转它们后我无法获得良好的法线。
在 MATRIX apply 之后,我的模型的 3D 计算工作正常,但是根据正常方向,光线真的很奇怪。
struct InstancingVSinput
{
float4 Position : SV_POSITION0;
float4 Norm : NORMAL0;
float2 TexCoord : TEXCOORD0;
};
struct InstancingVSoutput
{
float4 Position : POSITION0;
float3 Norm : NORMAL0;
float2 TexCoord : TEXCOORD0;
};
InstancingVSoutput InstancingVS(InstancingVSinput input,
float4 InstPos : POSITION1, float4 InstTexCoord : TEXCOORD1,
float4 Mat1 : POSITION2, float4 Mat2 : POSITION3, float4 Mat3 : POSITION4, float4 Mat4 : POSITION5)
{
InstancingVSoutput output;
float4x4 O = float4x4(Mat1, Mat2, Mat3, Mat4);
float4 pos = mul(input.Position,xWorld);
pos = mul(input.Position, O);
pos = InstPos + pos;
O = transpose(O);
float3 norm = normalize((float3)input.Norm);
norm = mul(norm, (float3x3)O);
pos = mul(pos, WVP);
output.Position = pos;
output.Norm = norm;
output.TexCoord = float2((input.TexCoord.x / 2.0f) + (1.0f / 2.0f * InstTexCoord.x),
(input.TexCoord.y / 2.0f) + (1.0f / 2.0f * InstTexCoord.y));
return output;
}
float4 InstancingPS(InstancingVSoutput input) : COLOR0
{
float4 C = tex2D(TextureSampler, input.TexCoord);
float3 N = input.Norm;
C.rgb *= dot(float3(0, -1, -1), N);
return C;
}
您是否应该建议我在旋转后恢复正常的正确方法?
谢谢
克里斯