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

Create Linegrid in Vulkan (line in x and y direction is missing) [fixed]

我创建了一种创建 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

我的意思是,每个四边形有六个索引。既然是行列表,那就意味着三行。你的第二行是退化的,所以实际上是两行。但是 quad 通常由四行组成。所以除非相邻的四边形共享额外的线,否则不会有任何东西。对于边界四边形,没有相邻的四边形。所以左上角的四边形只显示两条线。