0

我正在尝试使用正交投影矩阵在 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。但也许我倒退了?

控制我的顶点被绘制到哪些纹素行的正确方法是什么?

我不知道这是否有任何后果,但我会注意到我从未将这个纹理渲染到屏幕上。我正在将纹理保存到图像文件中。

4

1 回答 1

0

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

XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 127.5f, -0.5f, 256.0f, 0.0f);
于 2014-05-27T17:15:11.237 回答