0

パーリン ノイズを使用して地形を生成し、次を使用して法線を計算しています。

    D3DXVECTOR3 v0 = aoVertices[auiIndices[i]].Position;
    D3DXVECTOR3 v1 = aoVertices[auiIndices[i + 1]].Position;
    D3DXVECTOR3 v2 = aoVertices[auiIndices[i + 2]].Position;
    D3DXVECTOR3 v3 = aoVertices[auiIndices[i + 3]].Position;
    D3DXVECTOR3 v4 = aoVertices[auiIndices[i + 4]].Position;
    D3DXVECTOR3 v5 = aoVertices[auiIndices[i + 5]].Position;

    D3DXVECTOR3 vNormal;
    D3DXVECTOR3 vCross;
    D3DXVec3Cross(&vCross, &D3DXVECTOR3(v2 - v0), &D3DXVECTOR3(v1 - v0));
    D3DXVec3Normalize(&vNormal, &vCross);

    aoVertices[auiIndices[i]].Normal = D3DXVECTOR3(vNormal);
    aoVertices[auiIndices[i + 1]].Normal = D3DXVECTOR3(vNormal);
    aoVertices[auiIndices[i + 2]].Normal = D3DXVECTOR3(vNormal);

    D3DXVec3Cross(&vCross, &D3DXVECTOR3(v5 - v3), &D3DXVECTOR3(v4 - v3));
    D3DXVec3Normalize(&vNormal, &vCross);

    aoVertices[auiIndices[i + 3]].Normal = D3DXVECTOR3(vNormal);
    aoVertices[auiIndices[i + 4]].Normal = D3DXVECTOR3(vNormal);
    aoVertices[auiIndices[i + 5]].Normal = D3DXVECTOR3(vNormal);

ただし、これにより、グリッドの正方形の間にグリッド線が表示されます。問題は何ですか?

例: 例

4

1 に答える 1

0

DX10についてはよくわかりませんが、最近OpenGLでこれを行いました。三角形ごとに法線を実行しているように見えます。これにより、フラットなシェーディングが得られるため、表示される内容はおそらく正しいでしょう。

頂点ごとの法線を計算する場合は、次のようなものを使用します。

((x + 1)-(X-1))X((Y + 1)-(Y-1))

ここで、Xはグリッド上のX方向の頂点であり、YはY方向の頂点です。

于 2011-02-11T03:26:13.097 に答える