我正在使用 HLSL 和 DirectX 9。我正在尝试重新计算网格的法线,以便 HLSL 接收由于网格变换而更新的法线。什么方法最好做到这一点...另外...D3DXComputeNormals 对我不起作用,因为我不使用 FVF_NORMAL 作为顶点声明...我声明顶点格式如下:
const D3DVERTEXELEMENT9 dec[4] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,0},
D3DDECL_END()
};
我知道如何访问邻接数据和顶点缓冲区,但我不确定使用什么方法才能正确地将顶点及其法线与面关联起来......任何帮助将不胜感激。谢谢!
最佳答案
每帧更新 CPU 上的法线并将其发送到 GPU 并不是一个好主意。那会破坏性能。您真正应该做的是在顶点着色器中计算变换后的法线,就像处理位置一样。 HLSL 代码如下所示:
float4x4 mWorldView; // World * View
float4x4 mWorldViewProj; // World * View * Proj
struct VS_OUTPUT
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normalVS : TEXCOORD1; // view-space normal
};
// Vertex Shader
VS_OUTPUT VS(float3 position : POSITION,
float3 normal : NORMAL,
float2 tex : TEXCOORD0)
{
VS_OUTPUT out;
// transform the position
out.position = mul(float4(position, 1), mWorldViewProj);
// pass the texture coordinates to the pixel shader
out.tex = tex;
// calculate the transformed normal
float3 n = mul(normal, (float3x3)mWorldView); // calculate view-space normal
// and use it for vertex lighting
// ... some shading calculations ...
// or pass it to the pixel shader and perform per-pixel lighting
out.normalVS = n;
// output
return out;
}
关于c++ - Directx 和 HLSL - 正常重新计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589599/