2016-12-05 56 views
2

在使用可见性结果功能(通过在命令编码器上调用setVisibilityResultMode)时,我使用MTLVisibilityResultModeBoolean模式获取布尔值,告诉我是否有任何片段通过了可见性测试。macOS上的金属:可见性测试行为不正确

经过这一点摔跤后,我注意到,我实际上并没有使用此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

documentation,这按预期方式工作:

MTLVisibilityResultModeBoolean模式中,当样品通过时, 装置的非零值写入缓冲器。如果没有样品通过,则 设备写入零。

+0

这是我的坏@warrenm,我不知何故错过了这一段,并认为它是一个'BOOL'。然后再次,这个段落没有正确描述被写入的数据类型。我已经向Apple提交了一个文档错误。 – ldoogy

+0

感谢您的报告。你能分享雷达号码吗? – warrenm

+0

确实是@warrenm,它是29512495.谢谢你的帮助。顺便说一下,关于非零值的文本并不是我预期的那样。它位于“图形渲染:渲染命令编码器”下的“金属编程指南”中,但是当您查找“MTLVisibilityResultModeBoolean”的引用时,它所表示的只是“指示样本是否通过深度和模板测试”。 – ldoogy

1

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

必须是8个字节的倍数。

该对齐通常仅对于8字节(64位)类型才是必需的。所以,你应该使用uint64_t而不是uint32_t

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

+0

是的,我正在读取偏移量0.将@ warrenm的答案和你的答案结合起来,我们可以推断出这可能是一个'uin64_t',它应该被测试为一个非零值。尽管如此,我仍然认为这是没有明确规定的数据类型,因此没有很好的文档记录。 – ldoogy