DirectXのドキュメントによると、0.5ピクセルのオフセットは、「事前に変換された頂点を使用して2D出力をレンダリングする場合」にのみ必要です。事前に変換された頂点は、呼び出しD3DFVF_XYZRHW
で指定されたフラグを持つ頂点です。IDirect3DDevice9::SetFVF
変換された頂点を正しく描画するには、その位置を頂点の画面空間座標(ピクセル単位)に設定する必要が(posx - 0.5, posy - 0.5, 0, 1)
あり(posx, posy)
ます。
フルスクリーンのテクスチャクワッドをレンダリングするためのコードは次のとおりです。
struct TRANSFORMED_VERTEX
{
D3DXVECTOR4 pos;
D3DXVECTOR2 tex;
static const DWORD FVF;
};
const DWORD TRANSFORMED_VERTEX::FVF = D3DFVF_XYZRHW | D3DFVF_TEX1;
void RenderFullScreenQuad()
{
D3DSURFACE_DESC desc;
LPDIRECT3DSURFACE9 pSurf;
g_pd3dDevice->GetRenderTarget(0, &pSurf);
pSurf->GetDesc(&desc);
pSurf->Release();
float width = (float)desc.Width - 0.5f;
float height = (float)desc.Height - 0.5f;
TRANSFORMED_VERTEX v[4];
v[0].pos = D3DXVECTOR4(-0.5f, -0.5f, 0.0f, 1.0f);
v[1].pos = D3DXVECTOR4(width, -0.5f, 0.0f, 1.0f);
v[2].pos = D3DXVECTOR4(-0.5f, height, 0.0f, 1.0f);
v[3].pos = D3DXVECTOR4(width, height, 0.0f, 1.0f);
v[0].tex = D3DXVECTOR2(0.0f, 0.0f);
v[1].tex = D3DXVECTOR2(1.0f, 0.0f);
v[2].tex = D3DXVECTOR2(0.0f, 1.0f);
v[3].tex = D3DXVECTOR2(1.0f, 1.0f);
g_pd3dDevice->SetFVF(TRANSFORMED_VERTEX::FVF);
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(TRANSFORMED_VERTEX));
}
もちろん、との間でこの関数を呼び出す必要がありBeginScene()
ますEndScene()
。また、テクスチャとサンプラーの状態(またはシェーダー定数)を適切に設定する必要があります。