DirectX11使用缓冲区中的第一个顶点的每个三角形

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

我目前在DirectX 11体素渲染器中遇到问题,无论何时渲染三角形,都会使用缓冲区中的第一个顶点,而不是正确的顶点之一。

我在Unity中具有相同网格生成算法的工作版本,并且在比较了索引和顶点之后,它们是完全相同的,因此我不认为算法存在问题。

之所以知道正在使用缓冲区中的第一个顶点,是因为为每个块创建的第一个顶点位于该块的原点。每个块GameObject的世界位置为(0,0,0),并且在构造每个块的网格时,将块的位置作为偏移量添加到每个顶点。

正如您在下图中看到的那样,三角形一直延伸到块的原点(第一个顶点)。仍然可以看到体素地形的山形,因此在正确的位置渲染了一些顶点。我只是不明白为什么似乎每个第三个索引都被设置为0(我不确定这是否真的在发生,它看起来就像我想象的那样)。

Image of the triangles stretching

这是我用于为每个块创建顶点和索引缓冲区的代码。 m_vertices和m_indices都是向量,当我比较它们时,它们与工作的Unity版本相同。

    VoxelMesh mesh;
    DirectX::VertexPositionNormalTexture* verticesArray = new DirectX::VertexPositionNormalTexture[m_vertices.size()];
    for (unsigned int i = 0; i < m_vertices.size(); i++) {
        verticesArray[i].position = m_vertices[i];
        verticesArray[i].normal = m_normals[i];
        verticesArray[i].textureCoordinate = m_uvs[i];
    }

    //Create vertex buffer
    ID3D11Buffer* vertexBuffer;
    D3D11_BUFFER_DESC bd;
    ZeroMemory(&bd, sizeof(bd));
    bd.Usage = D3D11_USAGE_DEFAULT;
    bd.ByteWidth = sizeof(DirectX::VertexPositionNormalTexture) * m_vertices.size();
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bd.CPUAccessFlags = 0;

    D3D11_SUBRESOURCE_DATA InitData;
    ZeroMemory(&InitData, sizeof(InitData));
    InitData.pSysMem = verticesArray;

    device->CreateBuffer(&bd, &InitData, &vertexBuffer);

    mesh.m_VertexBuffer = vertexBuffer;
    mesh.m_VBOffset = 0;
    mesh.m_VBStride = sizeof(DirectX::VertexPositionNormalTexture);


    //Create index buffer
    unsigned int* indicesArray = new unsigned int[m_indices.size()];
    for (unsigned int i = 0; i < m_indices.size(); i++) {
        indicesArray[i] = m_indices[i];
    }

    ID3D11Buffer* indexBuffer;

    D3D11_BUFFER_DESC bd1;
    ZeroMemory(&bd1, sizeof(bd1));
    bd1.Usage = D3D11_USAGE_DEFAULT;
    bd1.ByteWidth = sizeof(WORD) * m_indices.size();
    bd1.BindFlags = D3D11_BIND_INDEX_BUFFER;
    bd1.CPUAccessFlags = 0;

    ZeroMemory(&InitData, sizeof(InitData));
    InitData.pSysMem = indicesArray;
    device->CreateBuffer(&bd1, &InitData, &indexBuffer);

    mesh.m_IndexCount = m_indices.size();
    mesh.m_IndexBuffer = indexBuffer;

    delete[] indicesArray;
    delete[] verticesArray;

VoxelMesh结构:

struct VoxelMesh {
    ID3D11Buffer* m_VertexBuffer;
    ID3D11Buffer* m_IndexBuffer;
    UINT m_VBStride;
    UINT m_VBOffset;
    UINT m_IndexCount;
};
c++ rendering directx directx-11 index-buffer
1个回答
0
投票

您的索引缓冲区被声明为R16_UINT,但是您提供的缓冲区使用的是32位索引。将indicesArray更改为unsigned short*,或将缓冲区更改为R32_UINT。

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