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

时间:2016-12-05 18:27:51

标签: objective-c macos metal

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

在与此摔跤之后,我注意到我实际上并没有使用此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);

这在我的测试中正常工作,但我担心这可能无法在其他GPU /驱动程序上正常工作,因为它似乎与文档不匹配。任何人的想法?

2 个答案:

答案 0 :(得分:2)

根据documentation,这是按预期工作的:

  

MTLVisibilityResultModeBoolean模式下,当样本通过时,   设备将非零值写入缓冲区。如果没有样品通过,那么   设备写入零。

答案 1 :(得分:1)

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

  

必须是8个字节的倍数。

这种对齐通常仅对8字节(64位)类型是必需的。因此,您应该使用uint64_t而不是uint32_t

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