在 Vulkan 中创建 Linegrid缺少 x 和 y 方向的线[已修复]

问题描述

我创建了一种创建 3D 线网格的方法。 我将我的代码定位在 DirectX 12 的 3D 游戏编程示例上。 当我运行基于 vulkan 的应用程序时,我得到一个线网格,但缺少 x 和 y 方向的最后一行 (Link to image)。 谁能帮我解决这个问题。 我的第一个想法是渲染选项多边形模式线(VK_polyGON_MODE_LINE)的问题 和原始拓扑线列表 (VK_PRIMITIVE_TOPOLOGY_LINE_LIST)。但经过研究,这些功能正在发挥作用。

以下代码显示了我的网格的创建:

struct Vertex {
    glm::vec3 position;
    glm::vec3 color;
};

Mesh Mesh::CreateGrid(DrawingInstance& instance,float width,float depth,unsigned int m,unsigned int n)
{
    // 3D Game Programming with DirectX 12 - P. 302ff

    std::vector<Vertex> vertices;
    std::vector<uint32_t> indices;

    unsigned int vertexCount = m * n;
    unsigned int faceCount = (m - 1)*(n - 1) * 2;

    // Create vertices
    float halfWidth = width * 0.5f;
    float halfDepth = depth * 0.5f;

    float dx = width / (n - 1);
    float dz = depth / (m - 1);

    float du = 1.0f / (n - 1);
    float dv = 1.0f / (m - 1);

    vertices.resize(vertexCount);
    for (unsigned int i = 0; i < m; ++i)
    {
        float z = halfDepth - i * dz;
        for (unsigned int j = 0; j < n; ++j)
        {
            float x = -halfWidth + j * dx;

            vertices[i*n + j].position = glm::vec3(x,z,0.0f);
            vertices[i*n + j].color = glm::vec3(0.0f,1.0f,0.0f);
        }
    }

    // create Indizes
    indices.resize(faceCount*3);

    unsigned int k = 0;
    for (unsigned int i = 0; i < m - 1; ++i)
    {
        for (unsigned int j = 0; j < n - 1; ++j)
        {
            indices[k + 0] = i * n + j;
            indices[k + 1] = i * n + j + 1;
            indices[k + 2] = (i + 1)*n + j;

            indices[k + 3] = (i + 1)*n + j;
            indices[k + 4] = i * n + j + 1;
            indices[k + 5] = (i + 1)*n + j + 1;

            k += 6; // next quad
        }
    }
    return Mesh(instance,vertices,indices,VK_polyGON_MODE_LINE,VK_PRIMITIVE_TOPOLOGY_LINE_LIST);
}

解决错误的更改:

    
    // create Indizes
    
    indices.resize(faceCount * 4);

    unsigned int k = 0;
    for (unsigned int i = 0; i < m - 1; ++i)
    {
        for (unsigned int j = 0; j < n - 1; ++j)
        {

            indices[k + 0] = i * n + j;
            indices[k + 1] = i * n + (j + 1);
            indices[k + 2] = i * n + (j + 1);
            indices[k + 3] = (i + 1) * n + j + 1;

            indices[k + 4] = (i + 1) * n + j + 1;
            indices[k + 5] = (i + 1) * n + j;
            indices[k + 6] = (i + 1) * n + j;
            indices[k + 7] = i * n + j;

            k += 8;
        }
    }
...

enter image description here

解决方法

我的意思是,每个四边形有六个索引。由于它是一个行列表,这意味着三行。你的第二行是退化的,所以实际上是两行。但是四边形通常由四行组成。因此,除非相邻的四边形共享额外的线,否则将一无所有。对于边界四边形,没有相邻的四边形。所以左上角的四边形只显示了两条线。