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