如何在 DirectX 中绘制 2D 几何图形和 3D 对象? (D3D9)
How can I draw 2D geometry benind 3D objects in DirectX? (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 球体,将黄道平面作为二维线的网格,地球的一半在黄道之上,因此地球的一半应该绘制在黄道网格,我使用的代码整个网格总是在地球的顶部,所以看起来整个星球都在网格下面。
这是截图: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
方法,D3DPRIMITIVETYPE
为 D3DPT_LINELIST
或 D3DPT_LINESTRIP
。您可能会使用 DrawPrimitiveUP
或 DrawIndexedPrimitiveUP
,尽管使用带有动态顶点缓冲区的非 UP 版本效率更高。
旧版 D3DX9 实用程序库中的 D3DXCreateLine
用于类似 CAD 场景的样式线。用现代 DirectX 11 的说法,D3DXCreateLine
基本上类似于用于 2D 渲染的 Direct2D。
对于 Direct3D 11,在使用 ID3D11DeviceContext::IASetPrimitiveTopology
将其设置为 D3D11_PRIMITIVE_TOPOLOGY_LINELIST
或 11_PRIMITIVE_TOPOLOGY_LINESTRIP
模式后,您将使用 ID3D11DeviceContext::Draw
或 ID3D11DeviceContext::DrawIndexed
。对于 "UP" 样式绘图,请参阅 DirectX Tool Kit. I in fact use PrimitiveBatch to draw a 3D grid of lines into a 3D scene in the Simple Sample 中的 PrimitiveBatch
for DirectX Tool Kit。
我正在使用 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 球体,将黄道平面作为二维线的网格,地球的一半在黄道之上,因此地球的一半应该绘制在黄道网格,我使用的代码整个网格总是在地球的顶部,所以看起来整个星球都在网格下面。
这是截图: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
方法,D3DPRIMITIVETYPE
为 D3DPT_LINELIST
或 D3DPT_LINESTRIP
。您可能会使用 DrawPrimitiveUP
或 DrawIndexedPrimitiveUP
,尽管使用带有动态顶点缓冲区的非 UP 版本效率更高。
D3DXCreateLine
用于类似 CAD 场景的样式线。用现代 DirectX 11 的说法,D3DXCreateLine
基本上类似于用于 2D 渲染的 Direct2D。
对于 Direct3D 11,在使用 ID3D11DeviceContext::IASetPrimitiveTopology
将其设置为 D3D11_PRIMITIVE_TOPOLOGY_LINELIST
或 11_PRIMITIVE_TOPOLOGY_LINESTRIP
模式后,您将使用 ID3D11DeviceContext::Draw
或 ID3D11DeviceContext::DrawIndexed
。对于 "UP" 样式绘图,请参阅 DirectX Tool Kit. I in fact use PrimitiveBatch to draw a 3D grid of lines into a 3D scene in the Simple Sample 中的 PrimitiveBatch
for DirectX Tool Kit。