読者です 読者をやめる 読者になる 読者になる

何でもかんでもdiffuseって呼ぶの禁止

DirectX

http://bbx.hp.infoseek.co.jp/cgi-bin/bbx.cgi?log=40&vew=430より.

ディフューズ色が存在して、あえてそれを無視したレンダリング(D3DTOP_SELECTARG1を指定)の結果とは違ったものになっていたので。
存在しないディフューズ色はどのように解釈されているのでしょうか?

頂点バッファの「D3DFVF_DIFFUSE」と,SetTextureStageState での 「D3DTA_DIFFUSE」は一対一に対応するものではありません.前者は頂点処理(ライティング)以前の頂点単位の値ですし,後者は頂点処理(ライティング)が終わりピクセル処理段階まで進んだ際のピクセル単位の色入力の1つです.前者が存在しないことと後者が存在しない(ということはあり得なくて単に明示的に設定しない場合)は意味が異なります.

ちなみにこれらは両方ミスリーディングな名前をしていて,DIFFUSE と名前が付いていますが Diffuse Model のライティング計算に絡める必要はありません.DirextX開発者が「ディフューズ色」と呼んでいるものは,単に変数名がdiffuseであるという程度の理由でそう呼ばれていることがあるのを憶えておいてください.

書いていて気付いたんですが,自分も結構"Diffuse"という変数名使ってますね.どうやら過去に作った頂点構造体をコピー&ペーストして広がってしまったようです.反省.
さて,DirectXの「固定機能(頂点)処理」は既に様々な点で盲腸と化しているため*1いちいちつっこみを入れるのも野暮というものですが,視点を変えて今現在重要なHLSLでの興味深い警告を紹介しておきます.例えば以下のようなHLSLを書いたとします.

struct VS_T_INPUT
{
    float4 Pos : POSITION;
    float4 Color : DIFFUSE;
    float2 Tex0 : TEXCOORD0;
};
struct VS_OUTPUT
{
    float4 Pos : POSITION;
    float4 Color : DIFFUSE;
    float2 Tex0 : TEXCOORD0;
};

これを適当にデバッグレベルを上げてコンパイルすると以下のようなメッセージが出力されます.

D3DX: (47): warning X4705: input semantic 'DIFFUSE' has been deprecated; use 'COLOR0' instead
D3DX: (39): warning X4705: input semantic 'DIFFUSE' has been deprecated; use 'COLOR0' instead

警告X4705によれば,'DIFFUSE'というセマンティクスはdeprecated*2だそうです.この警告に従えばこのセマンティクス宣言は以下のようにするべきということになります.

struct VS_T_INPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR0;
    float2 Tex0 : TEXCOORD0;
};
struct VS_OUTPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR0;
    float2 Tex0 : TEXCOORD0;
};

確かに「カラー(レジスタ)0」という表現(抽象)は変な予断を与えないという意味で無難ですし,何よりプログラマブルシェーダの実装ともよくマッチしていますね.Coolです.
とまあ手元のコードを"diffuse"で全文検索しながら青くなる夜でした.

*1:そもそも聞いた人が名前から内容を想像できない時点で盲腸で,普通は「固定機能って何?」と混乱に拍車をかけてくれるのが悲惨です

*2:deprecate : to strongly disapprove of or criticize something [Longman Dictionary of Contemporary English]