我尝试用 D3D11 在两个顶点之间画一条线。我在 D3D9 和 D3D11 中有一些经验,但在 D3D11 中绘制一条线(从一个给定像素开始并以另一个像素结束)似乎是一个问题。
我做了什么:
-
我向每个顶点的像素坐标添加了 0.5f 以适应纹素/像素坐标系(我阅读了 Microsoft 页面以了解 D3D9 和 D3D11 坐标系之间的差异):
f32 f 关闭 = 0.5f;
ColoredVertex newVertices[2] =
{
{ D3DXVECTOR3(fStartX + fOff, fStartY + fOff,0), vecColorRGB },
{ D3DXVECTOR3(fEndX + fOff, fEndY + fOff,0), vecColorRGB }
};
-
生成一个正交投影矩阵以适合渲染目标:
D3DXMatrixOrthoOffCenterLH(&MatrixOrthoProj,0.0f,(f32)uRTWidth,0.0f,(f32)uRTHeight,0.0f,1.0f);
D3DXMatrixTranspose(&cbConstant.m_matOrthoProjection,&MatrixOrthoProj);
设置光栅化器状态、混合状态、视口...
- 将顶点绘制为 D3D11_PRIMITIVE_TOPOLOGY_LINELIST
问题:
该线似乎短了一个像素。它从给定的像素坐标开始并完美契合。线条的方向看起来是正确的,但我想要线条结束的像素仍然没有着色。看起来这条线只短了一个像素......
有教程解释这个问题吗?或者有人遇到同样的问题吗?我记得在 D3D9 中这并没有那么困难。
请询问您是否需要更多信息。
谢谢,斯特凡
编辑:找到 d3d10 的光栅化规则(应该与 d3d11 相同):http://msdn.microsoft.com/en-us/library/cc627092%28v=vs.85%29.aspx#Line_1
我希望这能帮助我理解......
根据光栅化规则(上面问题中的链接)我可能找到了一个应该有效的解决方案:
- 对顶点 StartX
- 将 (0.5/0.5) 添加到起始顶点(就像我之前所做的那样)以将顶点移动到像素的中心
- 添加(1.0/1.0)到结束顶点,将顶点移动到右下角
这是为了告诉光栅化器应该绘制线条的最后一个像素。
f32 fXStartOff = 0.5f;
f32 fYStartOff = 0.5f;
f32 fXEndOff = 1.0f;
f32 fYEndOff = 1.0f;
ColoredVertex newVertices[2] =
{
{ D3DXVECTOR3((f32)fStartX + fXStartOff, (f32)fStartY + fYStartOff,0), vecColorRGB },
{ D3DXVECTOR3((f32)fEndX + fXEndOff , (f32)fEndY + fYEndOff,0), vecColorRGB }
};
如果您知道更好的解决方案,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)