macOS 上的 Metal:可见性测试行为不正确

Metal on macOS: Visibility testing behaving incorrectly

在 Metal 中,当使用可见性结果功能时(通过在命令编码器上调用 setVisibilityResultMode),我使用 MTLVisibilityResultModeBoolean 模式来获取布尔值,告诉我是否有任何片段通过了可见性测试.

经过一段时间的研究后,我注意到我实际上并没有使用这个 API 得到一个布尔值。我似乎得到了一个 uint 来计算通过可见性测试的片段(像素??)的数量。我也不确定这个计数器的长度:它是 32 位的吗? 64 位?

实际上这似乎表现得像 MTLVisibilityResultModeCounting,但我肯定是在指定 MTLVisibilityResultModeBoolean

这是金属错误吗?我担心这可能是我笔记本电脑上的驱动程序错误,尽管它在我的 MacBook Pro(Radeon Pro 460 和 Intel HD Graphics 530)上的两个 GPU 上以相同的方式发生。

下面是我如何提取 BOOL:

uint32 *resultBuffer = [visibilityResultBuffer contents];
BOOL result = (*resultBuffer != 0);

这在我的测试中工作正常,但我担心这在其他 GPUs/drivers 上可能无法正常工作,因为它似乎与文档不符。有人有什么想法吗?

根据 documentation,这按预期工作:

In MTLVisibilityResultModeBoolean mode, when a sample passes, the device writes a nonzero value to the buffer. If no samples pass, the device writes zero.

我相信它是一个 64 位值,因为 -setVisibilityResultMode:offset:offset 参数的这部分文档:

Must be a multiple of 8 bytes.

通常只有 8 字节(64 位)类型才需要对齐。所以,你应该使用 uint64_t 而不是 uint32_t.

鉴于您获取值的代码,我假设您使用的偏移量为 0,对吗?否则,你读错地方了。