在 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 通常由四行组成。所以除非相邻的四边形共享额外的线,否则不会有任何东西。对于边界四边形,没有相邻的四边形。所以左上角的四边形只显示两条线。
我创建了一种创建 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 通常由四行组成。所以除非相邻的四边形共享额外的线,否则不会有任何东西。对于边界四边形,没有相邻的四边形。所以左上角的四边形只显示两条线。