Graphics 为什么在使用Vulkan渲染模型时会出现透明工件?

Graphics 为什么在使用Vulkan渲染模型时会出现透明工件?,graphics,3d,vulkan,Graphics,3d,Vulkan,我在Vulkan应用程序中使用tinyobjloader加载了一个模型。每个顶点的颜色仅等于其三维位置。使用RenderDoc I验证深度缓冲区是否正常工作: 但是颜色输出显示了一些奇怪的瑕疵,在这些瑕疵中可以看到被遮挡的顶点: 这是使用phong照明时工件的外观: 面方向和剔除是正确的 我尝试过SRGB和SFLOAT图像格式,两者都产生相同的结果 我不会显式地转换布局(因此不会使用VK_访问_深度_模板_附件_读取_位| VK_访问_深度_模板_附件_写入_位来更改访问掩码),而是让子

我在Vulkan应用程序中使用tinyobjloader加载了一个模型。每个顶点的颜色仅等于其三维位置。使用RenderDoc I验证深度缓冲区是否正常工作:

但是颜色输出显示了一些奇怪的瑕疵,在这些瑕疵中可以看到被遮挡的顶点:

这是使用phong照明时工件的外观:

  • 面方向和剔除是正确的
  • 我尝试过SRGB和SFLOAT图像格式,两者都产生相同的结果
  • 我不会显式地转换布局(因此不会使用VK_访问_深度_模板_附件_读取_位| VK_访问_深度_模板_附件_写入_位来更改访问掩码),而是让子访问处理它

由于Vulkan代码通常很长,因此我创建了一个示例,以便您可以查看主应用程序代码。如果你需要看更多,请告诉我

颜色混合是顺序相关的操作,与深度缓冲一起使用时非常棘手

您的代码是:

vk::PipelineColorBlendAttachmentState colorBlendAttachment(true,
vk::BlendFactor::eSrcColor, vk::BlendFactor::eOneMinusSrcColor,
vk::BlendOp::eAdd,
vk::BlendFactor::eOne, vk::BlendFactor::eZero,
vk::BlendOp::eAdd,
基本体(三角形)按基本体顺序处理。这里值得注意的是,索引缓冲区中的第一个三角形将首先被处理

现在,深度测试的工作原理是,如果一个片段通过了深度测试,它就会继续进行。这意味着一个片段可能成功。然后其他深度值更好的片段可以覆盖它

这会影响Dst混合值。在您的例子中,根据原语顺序,它将是清晰的颜色,或者之前的片段颜色,取决于首先发生的颜色


混合操作是
srcColor*srcColor+dstColor*(1-srcColor)
。如果以前的颜色是
0
,则会产生
2*srcColor
,这可能是无意义的,但不可察觉。但是如果
dstColor
是某种东西,那么您的输出就会变成某种明亮的工件颜色,带有更多的Dst色彩。

如果您尝试
VK_CULL_MODE_NONE
,会发生什么情况?在@krOoze处交叉张贴相同的工件,当使用no culling时,还可以尝试禁用混合。@krOoze禁用混合有效!非常感谢。为什么我不能在这里使用颜色混合?(源颜色和目标颜色分别为eSrcColor和EONEMINUSSRCOLOR。alpha值为1和0。)