日別アーカイブ: 2007年8月29日

Direct3D 10 Shader4.0 ピクセル補間モード

DirectX10 の PixelShader は、入力パラメータの補間方法を
選択することができます。例えば

struct PS_INPUT {
    float4 Pos                : SV_POSITION;
    float3 Normal             : NORMAL;
    noperspective float2 Tex0 : TEXCOORD0;
    float2 Tex1               : TEXCOORD1;
};

float4 PS_Main( PS_INPUT In ) : SV_Target
{
	...
}

こんな感じで In.Tex0 を受け取るとパースペクティブ補正がかかりません。
同次除算をいちいち Shader で打ち消す必要も無いので、補正無しの
リニアな値が欲しい場合は Shader4.0 に移植するだけで動作が速くなる
可能性があります。

他にも centroid, nointerpolation, linear といった宣言ができます。
使用可能な組み合わせをまとめてみました。

・nointerpolation (== constant)
・linear
・linear centroid
・linear noperspective
・linear noperspective centroid

無指定時は linear 相当なので、linear は書かなくてもかまいません。
nointerpolation は linear を打ち消すことができ、この場合補間
しない constant 相当となります。
整数値を渡す場合は補間できないので nointerpolation を使います。

linear 時は centroid と noperspective の組み合わせが可能です。
centroid は表記方法が違いますが D3D9 にもありました。

これら組み合わせを変えて試したところ、GeForce8800GTX では
noperspective の有り無しで若干速度が変化しました。
それ以外の組み合わせでは特に速度変化が表面上わかりませんでした。

1600	nointerpolation
1643	linear perspective
1643	linear perspective centroid
1600	linear noperspective
1600	linear noperspective centroid

実行時間(usec)の変化

パースペクティブ補正は演算量が多いためか、ピクセル面積が多いと
上記のように若干速度に違いがでるようです。

なお、この数値は機能の違いを調べるために差が出る状況を作り出した
ものです。負荷があがるかどうか増減を見るだけにしてください。
補間指定によってどれくらい遅くなるかなど、比率での比較は
できませんのでご注意ください。

RADEON HD2900XT ではまだ変化がでる状況が見られないので、
組み合わせによって負荷に違いがあるかどうかわかりませんでした。