我正在尝试实现 OIT(顺序独立透明度)和 MSAA(多样本抗锯齿),但渲染出现问题(见下图)。
OIT 在没有 MSAA 的情况下正常工作,反之亦然。只有两者结合才会导致故障。
OIT 是按照苹果教程使用图像块实现的:https://developer.apple.com/documentation/metal/metal_sample_code_library/implementing_order-independent_transparency_with_image_blocks。
我提供了 MRE(最小可重现示例)来重现该问题: OIT+MSAA
请注意,您可以使用拖动手势绕相机旋转。
我通过更新初始化数据块的函数使其工作。
来自:
kernel void initializeTransparentFragments(imageblock<TransparentFragment, imageblock_layout_explicit> blockData, ushort2 localThreadID [[ thread_position_in_threadgroup ]]) {
threadgroup_imageblock TransparentFragment* values = blockData.data(localThreadID);
for (short i = 0; i < layerCount; ++i) {
values->colors[i] = 0;
values->depths[i] = INFINITY;
}
}
致:
kernel void initializeTransparentFragments(imageblock<TransparentFragment, imageblock_layout_explicit> blockData, ushort2 localThreadID [[ thread_position_in_threadgroup ]]) {
for (short k = 0; k < sampleCount; ++k) {
threadgroup_imageblock TransparentFragment* values = blockData.data(localThreadID, k, imageblock_data_rate::sample);
for (short i = 0; i < layerCount; ++i) {
values->colors[i] = 0;
values->depths[i] = INFINITY;
}
}
}
非常感谢 Spo1ler 发现了这个问题!