Vulkan 正面缠绕顺序
Vulkan front face winding order
我将 Vulkan VkPipelineRasterizationStateCreateInfo
配置为使用 CCW 缠绕顺序:
VkPipelineRasterizationStateCreateInfo rasterizer = {};
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterizer.depthClampEnable = VK_FALSE;
rasterizer.rasterizerDiscardEnable = VK_FALSE;
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
rasterizer.lineWidth = 1.0f;
rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
rasterizer.depthBiasEnable = VK_FALSE;
我的装配状态用三角扇画四边形:
VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
inputAssembly.primitiveRestartEnable = VK_FALSE;
这是我的顶点缓冲区:
const VertexPos2Col3 vertices[4] = {
{{0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}},
{{-0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}},
{{ 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}}
};
顶点的顺序是逆时针的。但是只有当我设置 rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;
时,原语才会出现
这是为什么?
系统信息:
Windows10、NVIDIA RTX3000,驱动程序:431.86
那是因为 Vulkan 使用的坐标系与其他坐标系不同。 OpenGL。 Vulkan 的原点在左上角。
因此您必须通过更改 vertex/index 顺序、翻转视口或更改顶点着色器中的 gl_position.y
来解决这个问题。如果您的目标支持 VK_KHR_maintenance1
扩展,那么最简单的方法是 use a negative height 翻转视口。
我将 Vulkan VkPipelineRasterizationStateCreateInfo
配置为使用 CCW 缠绕顺序:
VkPipelineRasterizationStateCreateInfo rasterizer = {};
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterizer.depthClampEnable = VK_FALSE;
rasterizer.rasterizerDiscardEnable = VK_FALSE;
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
rasterizer.lineWidth = 1.0f;
rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
rasterizer.depthBiasEnable = VK_FALSE;
我的装配状态用三角扇画四边形:
VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
inputAssembly.primitiveRestartEnable = VK_FALSE;
这是我的顶点缓冲区:
const VertexPos2Col3 vertices[4] = {
{{0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}},
{{-0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}},
{{ 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}}
};
顶点的顺序是逆时针的。但是只有当我设置 rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;
时,原语才会出现
这是为什么?
系统信息:
Windows10、NVIDIA RTX3000,驱动程序:431.86
那是因为 Vulkan 使用的坐标系与其他坐标系不同。 OpenGL。 Vulkan 的原点在左上角。
因此您必须通过更改 vertex/index 顺序、翻转视口或更改顶点着色器中的 gl_position.y
来解决这个问题。如果您的目标支持 VK_KHR_maintenance1
扩展,那么最简单的方法是 use a negative height 翻转视口。