[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