如何在 DirectX 中绘制 2D 几何体和 3D 对象?(D3D9)



>我正在使用D3DXVec3Project函数来获取3D点的屏幕坐标并绘制看起来像3D的2D线。显而易见的结果是,绘制的线条将始终位于任何 3D 对象的顶部,即使对象应该位于线条的前面。

这是我用来画线的代码:

 void DrawLine(float Xa, float Ya, float Xb, float Yb, float dwWidth, D3DCOLOR Color)
 {
    if (!g_pLine)
        D3DXCreateLine(d3ddev, &g_pLine);
    D3DXVECTOR2 vLine[2]; // Two points
    g_pLine->SetAntialias(0); // To smooth edges

    g_pLine->SetWidth(dwWidth); // Width of the line
    g_pLine->Begin();
    vLine[0][0] = Xa; // Set points into array
    vLine[0][1] = Ya;
    vLine[1][0] = Xb;
    vLine[1][1] = Yb;
    g_pLine->Draw(vLine, 2, Color); // Draw with Line, number of lines, and color
    g_pLine->End(); // finish
 }
举个例子,我把地球作为一个3D球体,把黄道平面作为一个2D线的网格,地球的一半在黄道的顶部,所以地球

的一半应该画在黄道网格的顶部,我使用的代码整个网格总是在地球的顶部,所以看起来整个星球都在网格下。

这是屏幕截图: http://s13.postimg.org/3wok97q7r/screenshot.png

如何在 3D 对象后面绘制线条?

好的,我现在让它工作了,这是在 D3D9 中绘制 3D 线条的代码:

LPD3DXLINE      g_pLine;
void Draw3DLine(float Xa, float Ya, float Za,
                float Xb, float Yb, float Zb,
                float dwWidth, D3DCOLOR Color)
{
    D3DXVECTOR3 vertexList[2];
    vertexList[0].x = Xa;
    vertexList[0].y = Ya;
    vertexList[0].z = Za;
    vertexList[1].x = Xb;
    vertexList[1].y = Yb;
    vertexList[1].z = Zb;
    static D3DXMATRIX   m_mxProjection, m_mxView;
    d3ddev->GetTransform(D3DTS_VIEW, &m_mxView);
    d3ddev->GetTransform(D3DTS_PROJECTION, &m_mxProjection);
    // Draw the line.
    if (!g_pLine)
    D3DXCreateLine(d3ddev, &g_pLine);
    D3DXMATRIX tempFinal = m_mxView * m_mxProjection;
    g_pLine->SetWidth(dwWidth);
    g_pLine->Begin();
    g_pLine->DrawTransform(vertexList, 2, &tempFinal, Color);
    g_pLine->End();
}

使用旧版 Direct3D 9,只需使用标准IDirect3DDevice9::DrawPrimitive方法,D3DPRIMITIVETYPED3DPT_LINELISTD3DPT_LINESTRIP 。您可能会使用 DrawPrimitiveUPDrawIndexedPrimitiveUP ,尽管使用带有动态顶点缓冲区的非 UP 版本效率要高得多。

旧版 D3DX9 实用程序库中的D3DXCreateLine适用于类似 CAD 的方案的样式化线条。 在现代DirectX 11的说法中,D3DXCreateLine基本上就像用于2D渲染的Direct2D一样。

使用

Direct3D 11,在使用 ID3D11DeviceContext::IASetPrimitiveTopology 将其设置为D3D11_PRIMITIVE_TOPOLOGY_LINELIST11_PRIMITIVE_TOPOLOGY_LINESTRIP模式后,你将使用 ID3D11DeviceContext::DrawID3D11DeviceContext::DrawIndexed 。有关"UP"样式绘图,请参阅 DirectX 工具包中的PrimitiveBatch。实际上,我使用 PrimitiveBatch 在 DirectX 工具包的简单示例中将线条的 3D 网格绘制成 3D 场景。

最新更新