0

[HLSL、*.fx ファイル、DirectX9 を使用]

私はシェーダーを使用するのが初めてで、シナリオが機能していますが、その理由がわかりません。シェーダーが別の頂点宣言を定義できる一方で、メッシュが頂点宣言の 1 つのバージョンをどのように持つことができるかについて、私は混乱しています。

ID3DXMeshで球を作成します。D3DXCreateSphere(...)これは でセットアップされD3DFVF_XYZ | D3DFVF_NORMALます。ID3DXMesh::DrawSubset(0)私はレンダリングを呼び出します。BeginPass/EndPass 呼び出し内。

次に、構造体が定義された頂点シェーダーを用意します。

struct Vertex {
    float4 position:POSITION;
    float2 textureCoords:TEXCOORD0;
    float3 lightDir:TEXCOORD1;
    float3 normal:TEXCOORD2;
};

およびシェーダー自体:

Vertex vertexShader( Vertex original, float3 _normal:NORMAL ) {
    Vertex result = (Vertex)0;

    float4x4 worldViewMatrix = mul( worldMatrix, viewMatrix );
    float4x4 worldViewProjectionMatrix = mul( worldViewMatrix, projectionMatrix );

    result.position = mul( original.position, worldViewProjectionMatrix );
    result.normal = -normalize( mul(_normal, worldMatrix) ); 

    result.textureCoords = original.textureCoords;
    result.lightDir = normalize(presetLightDir);

    return result;
}

lightDir と textureCoords を設定する前に null にすることもできますが、DirectX はそのVertex originalパラメーターで実際にどのようなデータを提供するのでしょうか?

位置だけ?が別のパラメーターとして提供されていることに気付きましたが、その値はシェーダーの開始時にfloat3 _normal:NORMALも内部にありますか?original

4

1 に答える 1

1

私が設定することを期待しているデータは次のとおりです。

  • result.position

  • _正常

また、original.textureCoordsが設定されていないため、result.textureCoordsはガベージである可能性があります。

これが機能する方法は、「タイプ名:セマンティック」を使用するため、この場合は「float4position:POSITION;」です。

通常、頂点シェーダーに送信するデータは、行の位置> texturecoords> lightDir> etcにあり、送信するデータはこの順序を維持する必要があります。

ただし、セマンティクスを使用すると、順序を変更できます。したがって、送信するデータは、float3POSITIONとfloat3NORMALに入力されます。(W = 1.0fであるXYZWであるfloat4を要求していることに注意してください)

頂点構造体にも「通常」があるという事実は、TEXTURECOORD2としてマークされているため、問題ではありません。

私はあまり明確ではなかったかもしれませんが、この助けを願っています。

于 2012-07-03T11:59:27.933 に答える