OIT + MSAA 导致 Metal 出现故障

问题描述 投票:0回答:1

我正在尝试实现 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

请注意,您可以使用拖动手势绕相机旋转。

metal msaa
1个回答
0
投票

我通过更新初始化数据块的函数使其工作。

来自:

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 发现了这个问题!

© www.soinside.com 2019 - 2024. All rights reserved.