[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