【问题标题】:DirectX 11 Direct Texel MappingDirectX 11 直接纹理映射
【发布时间】:2014-07-12 03:34:15
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多