Directx 如何在direct3d 9中正确实现纹理像素到纹理的校正?

Directx 如何在direct3d 9中正确实现纹理像素到纹理的校正?,directx,textures,direct3d,texture-mapping,direct3d9,Directx,Textures,Direct3d,Texture Mapping,Direct3d9,我曾经读过这样一篇文章,它描述了将纹理移动一半顶点位置的必要性,以便在texel和像素之间获得正确的映射。虽然我认为我理解它背后的理论,但当我尝试实现解决方案(向左移动半个单位)时,我得到的只是渲染图像两侧的黑线 我得到的印象是,我要么没有调整正确的x和y参数,要么这不适用于我的特定场景。我使用direct3d 9进行线性过滤,并渲染覆盖整个屏幕的图像。我尝试了纹理的实际大小和-1到+1(即根据两篇链接文章中的不同解决方案)。两种方法的效果相同 我的问题是,何时需要进行此校正?是否有正确的方法来

我曾经读过这样一篇文章,它描述了将纹理移动一半顶点位置的必要性,以便在texel和像素之间获得正确的映射。虽然我认为我理解它背后的理论,但当我尝试实现解决方案(向左移动半个单位)时,我得到的只是渲染图像两侧的黑线

我得到的印象是,我要么没有调整正确的x和y参数,要么这不适用于我的特定场景。我使用direct3d 9进行线性过滤,并渲染覆盖整个屏幕的图像。我尝试了纹理的实际大小和-1到+1(即根据两篇链接文章中的不同解决方案)。两种方法的效果相同


我的问题是,何时需要进行此校正?是否有正确的方法来进行此校正?根据DirectX文档,只有“在使用预变换顶点渲染2D输出时”才需要偏移半个像素。预转换的顶点是那些在
IDirect3DDevice9::SetFVF
调用中指定了
D3DFVF_XYZRHW
标志的顶点。为了正确绘制变换的顶点,必须将其位置设置为
(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;
&#二十,


当然,您需要在
BeginScene()
EndScene()
之间调用此函数。您还必须正确设置纹理和采样器状态(或着色器常量)。

谢谢。我错过了定义中的“HW”部分。如果我使用D3DFVF_XYZW怎么办?也就是说,我给出了后透视空间中的顶点。我的问题是,我的下采样着色器将图像偏移到右下角。
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));
}