c++ - Directx 和 HLSL - 正常重新计算

标签 c++ game-engine hlsl directx-9

我正在使用 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/

相关文章:

c++ - 如何从 vectors vector 中删除一个元素?

android - 将 flash 游戏移植到原生 android

c# - 在 XNA 中从文件动态编译和运行着色器

directx - HLSL 中的 uniform 关键字

c++ - 常量缓冲区大小不正确

c++ - 接近值无冲突的 3D 哈希

c++ std::bind 函数内

c++ - 使用boost.python在cygwin中手动构建python扩展

c# - 限制 Unity 正交相机平移运动

c++ - 改进碰撞检测