Vulkan 正面绕线顺序

Posted

技术标签:

【中文标题】Vulkan 正面绕线顺序【英文标题】:Vulkan front face winding order 【发布时间】:2019-11-07 16:49:52 【问题描述】:

我将 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; 时才会显示原语 这是为什么?

系统信息:

Windows 10、NVIDIA RTX3000、驱动程序:431.86

【问题讨论】:

你的相机怎么样? 在 NDC 空间中绘图。不使用任何转换。只是您在 -0.5 , 0.5 范围内看到的原始顶点位置 【参考方案1】:

这是因为 Vulkan 使用不同的坐标系,例如OpenGL。 Vulkan 的原点位于左上角。

因此,您必须通过更改顶点/索引顺序、翻转视口或更改顶点着色器中的gl_position.y 来解决这个问题。如果您的目标支持VK_KHR_maintenance1 扩展,那么最简单的方法是使用use a negative height 来翻转视口。

【讨论】:

以上是关于Vulkan 正面绕线顺序的主要内容,如果未能解决你的问题,请参考以下文章

Vulkan Tutorial 02 编写Vulkan应用程序框架原型

Vulkan Tutorial 02 编写Vulkan应用程序框架原型

初识Vulkan

如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)

初识Vulkan

[译]Vulkan教程(03)开发环境