我正在尝试使用正交投影矩阵在 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。但也许我倒退了?
控制我的顶点被绘制到哪些纹素行的正确方法是什么?
我不知道这是否有任何后果,但我会注意到我从未将这个纹理渲染到屏幕上。我正在将纹理保存到图像文件中。