DirectX 11 Direct Texel Mapping

时间:2014-05-22 22:17:01

标签: c++ viewport directx-11 render-to-texture projection-matrix

我正在尝试使用正交投影矩阵渲染到DirectX 11(C ++ API)中的纹理。在水平维度中,我正在利用发生的“投影”,但在垂直维度中,我希望我的顶点直接映射到特定的纹素行。

我创建了一个128x128的纹理。我将其设置为渲染目标并按如下方式设置视口:

D3D11_VIEWPORT textureViewport;
textureViewport.TopLeftX = 0.0f;
textureViewport.TopLeftY = 0.0f;
textureViewport.Height = 128.0f;
textureViewport.Width = 128.0f;
textureViewport.MinDepth = 0.0f;
textureViewport.MaxDepth = 1.0f;

我提供了这样创建的投影矩阵:

XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 128.0f, 0.0f, 256.0f, 0.0f);

请注意,我的左右值与纹理宽度不匹配,但从下到上的值与高度匹配。有了这个,我希望如果我的顶点着色器使用上面的SV_Position投影矩阵转换Y值为0.0f的坐标,它将被绘制到纹理的顶行。 Y值为127.0f的坐标将绘制到纹理的底行。

然而,在给出我期望填充整个纹理的数据之后(我将许多顶点绘制为点列表),我的纹理的底行是空白的。我注意到我的纹理的顶行似乎没有包含我期望它的顶点。似乎所有东西都向上移动了一排(或部分行)。

我已阅读DirectX 10 Coordinate System上的页面,但我不能完全理解这一点。我认为这告诉我,我不必像在DirectX 9中那样用0.5来抵消任何东西。但是我可能会倒退吗?

控制我的顶点被绘制到哪个texel行的正确方法是什么?

我不知道这是否有任何后果,但我会注意到我并没有将这种纹理渲染到屏幕上。我将纹理保存到图像文件。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。重读了我在问题中链接的文章后,我意识到我之前误解了坐标系。如果我按如下方式修改我的正交矩阵,那么我的顶点将转换为在纹素行的中心而不是在纹素行之间的边界上。现在所有数据都根据需要被绘制到纹理,我不再有空白底行的问题。

XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 127.5f, -0.5f, 256.0f, 0.0f);