D3D11:如何绘制一个简单的像素对齐线?

san*_*icz 7 c++ directx-11

我试图用D3D11在两个顶点之间画一条线.我在D3D9和D3D11中有一些经验,但在D3D11中绘制一条线似乎是一个问题,它在一个给定像素中开始并以另一个结束.

我做了什么:

  1. 我将0.5f添加到每个顶点的像素坐标以适应纹理像素/像素坐标系统(我读取了Microsoft页面到D3D9和D3D11坐标系之间的差异):

    f32 fOff = 0.5f; ColoredVertex newVertices [2] = {{D3DXVECTOR3(fStartX + fOff,fStartY + fOff,0),vecColorRGB},{D3DXVECTOR3(fEndX + fOff,fEndY + fOff,0),vecColorRGB}};

  2. 生成正交投影矩阵以适合渲染目标:

    D3DXMatrixOrthoOffCenterLH(&MatrixOrthoProj,0.0F,(F32)uRTWidth,0.0F,(F32)uRTHeight,0.0F,1.0F); D3DXMatrixTranspose(&cbConstant.m_matOrthoProjection,&MatrixOrthoProj);

  3. 设置RasterizerState,BlendState,Viewport,......

  4. 绘制顶点为D3D11_PRIMITIVE_TOPOLOGY_LINELIST

问题:Line看起来像是一个像素.它从给定的像素坐标开始,非常适合它.线条的方向看起来是正确的,但我希望线条结束的像素仍然没有着色.看起来这条线只是一个像素来缩短...

是否有任何教程解释这个问题或者有没有人有同样的问题?我记得在D3D9中并不困难.

请询问您是否需要进一步的信息.

谢谢,斯特凡

编辑:找到d3d10的光栅化规则(对于d3d11应该是相同的):http: //msdn.microsoft.com/en-us/library/cc627092%28v=vs.85%29.aspx#Line_1

我希望这能帮助我理解......

san*_*icz 4

根据光栅化规则(上面问题中的链接)我可能找到了一个应该有效的解决方案:

  1. 对顶点 StartX < EndX 和 StartY < EndY 进行排序
  2. 将 (0.5/0.5) 添加到起始顶点(就像我之前所做的那样)以将顶点移动到像素的中心
  3. 添加(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 }
};
Run Code Online (Sandbox Code Playgroud)

如果您知道更好的解决方案,请告诉我。