我正在尝试编写一个可变宽度的一般D3D11线条绘制。它工作,但只有当线约45度。然后它如图所示'分手'。忽略模型和三角形。
首先,尝试绘制线条的调用,非常基本:
g_UILineShader.SetActive();
for (float x = 0; x < 800; x = x + 10)
{
g_UILineShader.DrawUILine(pd3dDevice, x, 0, 800-x, 600, 3, XMFLOAT4(1.0f, 1.0f, 0.0f, 1.0f));
}
g_UILineShader.Render(pd3dDevice);
最终,三角形列表的渲染代码:
HRESULT Render(ID3D11Device * pd3dDevice)
{
auto devcon = DXUTGetD3D11DeviceContext();
// Copy all of the vertices in the array to the vertex buffer
D3D11_MAPPED_SUBRESOURCE ms;
devcon->Map(_pVertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); // map the buffer
memcpy(ms.pData, &_vertices[0], _vertices.size() * sizeof(UILineVertex)); // copy the data
devcon->Unmap(_pVertexBuffer, NULL); // unmap the buffer
// Set the vertex buffer on the device context
UINT stride = sizeof(UILineVertex);
UINT offset = 0;
ID3D11Buffer * pBuffer = _pVertexBuffer;
devcon->IASetVertexBuffers(0, 1, &pBuffer, &stride, &offset);
// Select which primtive type we are using
devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Draw the vertex buffer to the back buffer
devcon->Draw(_vertices.size(), 0);
// Once rendered we can discard all of the vertex data
_vertices.clear();
return S_OK;
}
任何人都可以发现错误或根本误解吗?如果有更好的方法在屏幕空间中绘制线条,允许不同的角度和厚度,我宁愿不重新发明轮子,但没有遇到过。
着色器似乎很好,只是将屏幕空间坐标除以屏幕尺寸,使其进入X和Y尺寸的-1,+ 1空间。我认为法线不重要,或者它们可能吗?
答案 0 :(得分:0)
万一有人遇到模糊相似的东西,结果证明是我的光栅化状态;剔除模式与我缠绕三角形的方式相反。 “Yay”用于VS2013图形调试器。