DirectX 11直接纹理映射

DirectX 11 Direct Texel Mapping

本文关键字:纹理映射 DirectX      更新时间:2023-10-16

我正在尝试使用正交投影矩阵在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坐标系统的页面,但我一定不能完全理解这一点。我认为这是在告诉我,我不需要像在DirectX 9中那样将任何东西偏移0.5。但也许我说反了?

什么是正确的方式来控制什么texel行我的顶点绘制到?

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

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

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