【问题标题】:How do I correctly implement texture pixel to texel correction in direct3d 9?如何在 direct3d 9 中正确实现纹理像素到纹理像素校正?
【发布时间】:2012-05-15 07:58:47
【问题描述】:

我已阅读 articlesa couple 描述了必须将纹理移动顶点位置的一半单位以获得纹理像素和像素之间的正确映射。虽然我认为我理解其背后的理论,但当我尝试实施解决方案时(向左移动半个单位),我得到的只是渲染图像两侧的黑线。

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

我的问题是,什么时候需要进行此更正,是否有正确的方法可以做到这一点?

【问题讨论】:

    标签: directx textures direct3d texture-mapping direct3d9


    【解决方案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;
    

    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()之间调用这个函数。您还必须正确设置纹理和采样器状态(或着色器常量)。

    【讨论】:

    • 谢谢。我错过了定义的“HW”部分。
    • 如果我使用 D3DFVF_XYZW 会怎样?也就是说,我在后透视空间中给出我的顶点。我的问题是我的下采样着色器将图像偏移到右下角。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2020-01-08
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多