1

地形生成にはrastertekフレームワークを使用しています。頂点シェーダーから地形をレンダリングしましたが、シェーダーで法線を計算する方法がわかりません。テレインから法線を生成するクラスの 1 つに関数呼び出しがありますが、これはテレインが CPU で生成された場合にのみ機能します。私が使用している頂点シェーダーのコードは次のとおりです。

////////////////////////////////////////////////////////////////////////////////
// Filename: terrain.vs
////////////////////////////////////////////////////////////////////////////////
#include "terrain.fx"

/////////////
// GLOBALS //
/////////////

cbuffer MatrixBuffer
{
    matrix worldMatrix;
    matrix viewMatrix;
    matrix projectionMatrix;
};


//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
    float4 position : POSITION;
    float3 normal : NORMAL;
};

struct PixelInputType
{
    float4 position : SV_POSITION;
    float3 normal : NORMAL;
};


////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType TerrainVertexShader(VertexInputType input)
{
    PixelInputType output;

    input.position.y = input.position.y + terrain(input.position.x,input.position.z);

    // Change the position vector to be 4 units for proper matrix calculations.
    input.position.w = 1.0f;

    // Calculate the position of the vertex against the world, view, and projection matrices.
    output.position = mul(input.position, worldMatrix);
    output.position = mul(output.position, viewMatrix);
    output.position = mul(output.position, projectionMatrix);

    // Calculate the normal vector against the world matrix only.
    output.normal = mul(input.normal, (float3x3)worldMatrix);

    // Normalize the normal vector.
    output.normal = normalize(output.normal);

    return output;
}
4

1 に答える 1

4

シェーダーで法線を生成する際の大きな問題は、周囲の頂点に関する知識が必要なことです。これは、ジオメトリ シェーダーで解決できますが、頂点シェーダーでは解決できません。法線を計算する簡単な方法は、見ている頂点に当たるすべてのポリゴンのポリゴン法線 (2 つのエッジから形成されたベクトルを取り、それらを面の法線に掛け合わせる) を計算し、それらを加算して正規化することです。したがって、ジオメトリ シェーダーにアクセスできない場合、唯一の解決策は CPU を使用することです。それでも、これは頂点法線を計算する最良の方法ではありません。より複雑なアルゴリズムを使用した方が良いと思うかもしれませんが、それはさらに多くの問題を引き起こします! ええ、CPU またはジオメトリ シェーダー ... 基本的に、これらはオプションです。

于 2013-04-07T13:15:45.297 に答える