如何在DirectX中的3D对象后面绘制2D几何? (D3D9)

时间:2015-01-10 23:05:29

标签: c++ directx 2d

我正在使用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();
}

1 个答案:

答案 0 :(得分:2)

使用旧版Direct3D 9,您只需使用标准IDirect3DDevice9::DrawPrimitive方法D3DPRIMITIVETYPE D3DPT_LINELISTD3DPT_LINESTRIP。您可能会使用DrawPrimitiveUPDrawIndexedPrimitiveUP,但使用带动态顶点缓冲区的非UP版本会更有效。

旧版D3DX9实用程序库中的

D3DXCreateLine适用于类似CAD的场景的样式线。在现代DirectX 11的说法中,D3DXCreateLine基本上类似于用于2D渲染的Direct2D。

使用Direct3D 11后,您可以在使用ID3D11DeviceContext::Draw将其设置为ID3D11DeviceContext::DrawIndexedID3D11DeviceContext::IASetPrimitiveTopology模式后使用D3D11_PRIMITIVE_TOPOLOGY_LINELIST11_PRIMITIVE_TOPOLOGY_LINESTRIP。对于" UP"样式图,请参阅DirectX Tool Kit中的PrimitiveBatch。实际上,我使用PrimitiveBatch在Simple Sample DirectX工具包中将3D网格线绘制到3D场景中。