09/01/27 18:03:03
たとえばスクリーン上の100x100の領域に描画するとしましょう
この描画はどこで行っているかというとピクセルシェーダです
自分で塗りつぶし処理を書く必要はありませんね
以下が最小のテクスチャ付きピクセルシェーダです
固定機能パイプラインであっても見えていないだけで似たような処理をしています
float4 PixScene( float4 Diffuse : COLOR0,float2 Tex0 : TEXCOORD0 ) : COLOR0
{
return tex2D( g_Texture, Tex0 ) * Diffuse;
}
これは、アドレッシングモードが違ってもまったく同じものが
ピクセルの数だけ、つまり100x100=10000回呼び出されます
たとえ広範囲に同じ色が固まっていっても関係ありません、どのモードでも1フレームあたり10000回です
ここでピクセルシェーダーの中をみてみましょう
tex2Dとはg_Texture(テクスチャです。ここでは256x256のテクスチャを既にセットしてあるとします)
のTex0(uv座標、頂点シェーダで計算済み)の色をサンプリングしてくれる関数と考えてください
例えば、Tex0.x=0.25、Tex0.y=0.5だったときはフィルタリングの状況にもよりますが
テクスチャの(64, 128)ドットの位置の色を返します
この色とDiffuse(ポリゴンの色、頂点シェーダで計算済み)を合成して最終的に塗りつぶす色を決定しています。
アドレッシングモードの違いはTex0の値が0.0~1.0を超えたときのtex2Dの挙動を決定します
Tex0.x=1.25、Tex0.y=1.5だったとしましょう
CLAMPでは0.0以下であれば0.0、1.0以上であれば1.0として扱います
つまりTex0.x=1.0 Tex0.y=1.0と同じ色、テクスチャの(256, 256)ドットの位置の色を返します
WRAPでははみ出た分は巻き戻って計算します
つまりTex0.x=0.25、Tex0.y=0.5と同じ色、テクスチャの(64, 128)ドットの位置の色を返します
当然では在りますが、PIXで処理時間を計測しても両者に差異は見当たりません