我在 Vulkan 中有一个带有colorBlendState
、blendEnable = false
、的管道logicOpEnable = true
,logicOp = XOR
以便片段着色器的输出与颜色附件的当前内容进行异或。我有这个工作,它的行为符合预期......大部分。
问题是,当在片段缓冲区中使用重叠三角形时,即使它们都位于同一渲染通道中,这些三角形似乎也会相互异或。经过一番研究后,这似乎可能是正确的行为,但这不是我的案例所期望的。有什么方法可以修改我的管道/渲染通道以仅在片段着色器输出和加载的颜色附件内容之间执行逻辑操作,而不是在片段着色器的各个三角形之间执行逻辑操作?
也就是说,我希望在没有混合或逻辑操作的情况下绘制顶点缓冲区中定义的所有三角形,直到最终结果写入颜色附件。有没有办法在不添加第二个渲染通道或子通道的情况下做到这一点?
逻辑运算不适用于三角形之间。它们是片段(可能由三角形生成)与当时帧缓冲区中的任何内容之间的关系操作。哪个“三角形”生成帧缓冲区值与操作无关。
但是,您可以采用其他操作来防止重叠。例如,您可以使用模板测试。如果将模板位清除为已知值,则可以让每个三角形对该值进行测试。仅当模板位针对帧缓冲区中的值进行测试时,每个片段的操作才会继续。但是,三角形也会将不同的值写入模板缓冲区。这样,如果两个三角形重叠,后一个三角形中位于前一个三角形之上的所有片段都将被剔除。
这包括任何逻辑运算的结果。
但是,您必须从前到后对三角形进行排序才能完成此操作。