在directx中创建一个正方形

时间:2016-01-18 10:23:15

标签: c++ directx

我目前正在尝试学习directX的基础知识,我需要一些简单的帮助。

我做了一个三角形,打印出来没有任何问题,但是当我尝试在该三角形上添加另一个角落以使其成为正方形时它不会起作用。我试图改变我创建角落的顺序但是这个最有意义并且不起作用。如果有人能看到它并告诉我我做错了什么,我会很高兴的。谢谢!

void CreateTriangleData()
{
    struct TriangleVertex
    {
        float x, y, z;
        float r, g, b;
    };

    TriangleVertex triangleVertices[4] =
    {
        0.5f, -0.5f, 0.0f,      //v1
        1.0f, 1.0f, 0.0f,                    //v1 color

        -0.5f, -0.5f, 0.0f,     //v2
        0.0f, 1.0f, 0.0f,                    //v2 color

        0.5f, 0.5f, 0.0f,       //v0 pos
        1.0f, 0.0f, 0.0f,                   //v0 color

        -0.5f, 0.5f, 0.0f,      //v3
        0.0f, 0.0f, 1.0f
    };

    D3D11_BUFFER_DESC bufferDesc;
    memset(&bufferDesc, 0, sizeof(bufferDesc));
    bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bufferDesc.Usage = D3D11_USAGE_DEFAULT;
    bufferDesc.ByteWidth = sizeof(triangleVertices);

    D3D11_SUBRESOURCE_DATA data;
    data.pSysMem = triangleVertices;
    gDevice->CreateBuffer(&bufferDesc, &data, &gVertexBuffer);
}

2 个答案:

答案 0 :(得分:0)

如果你没有使用索引,即你使用Draw()而不是DrawIndexed()绘图,你应该将所有对两个三角形有贡献的顶点(即6个顶点)放入顶点缓冲区)。如果要绘制四边形,则会有两对重复顶点。

为了避免重复,可以使用索引缓冲区。

典型问题:您应该保留顶点缓冲区中顶点的缠绕顺序,以使三角形可见(参见:Back-face culling

enter image description here

另见:

答案 1 :(得分:0)

您需要更改拓扑以使其正常工作。

您只使用顶点缓冲区,因此在4个顶点的情况下需要TRIANGLESTRIP拓扑,在6个顶点的情况下需要TRIANGLELIST。 TRIANGLESTRIP将从顶点1,2和3创建一个三角形,从3,4和1顶点创建第二个三角形,这两个三角形都变成一个矩形。 TRIANGLELIST将从顶点1,2和3创建一个三角形,从4,5和6创建第二个三角形,在这种情况下,您需要再给出两个顶点。

此处列出了不同类型的拓扑 https://msdn.microsoft.com/en-us/library/windows/desktop/ff728726(v=vs.85).aspx

第二个选项是使用索引缓冲区,而不是这里解释的顶点缓冲区https://msdn.microsoft.com/en-us/library/windows/desktop/ff476897%28v=vs.85%29.aspx