D3D线条画分割成三角形 - 它几乎可以工作,但需要一个提示

问题描述 投票:1回答:1

我正在尝试编写一个可变宽度的一般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空间。我认为法线不重要,或者他们可以吗?

c++ line direct3d hlsl
1个回答
0
投票

万一有人遇到模糊相似的东西,结果证明是我的光栅化状态;剔除模式与我缠绕三角形的方式相反。 “Yay​​”用于VS2013图形调试器。

© www.soinside.com 2019 - 2024. All rights reserved.