Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c macOS上的金属:可见性测试行为不正确_Objective C_Macos_Metal - Fatal编程技术网

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

Objective c macOS上的金属:可见性测试行为不正确,objective-c,macos,metal,Objective C,Macos,Metal,在Metal中,当通过在命令编码器上调用setVisibilityResultMode来使用可见性结果功能时,我使用MTLVisibilityResultModeBoolean模式来获取一个布尔值,告诉我是否有任何片段通过了可见性测试 经过一段时间的努力,我注意到我并没有使用这个API得到布尔值。我似乎在数碎片的数量像素??通过了可视性测试。我也不确定这个计数器的长度:是32位吗?64位 实际上,这看起来像是MTLVisibilityResultModeCounting,但我确实指定了MTLVi

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

经过一段时间的努力,我注意到我并没有使用这个API得到布尔值。我似乎在数碎片的数量像素??通过了可视性测试。我也不确定这个计数器的长度:是32位吗?64位

实际上,这看起来像是MTLVisibilityResultModeCounting,但我确实指定了MTLVisibilityResultModeBoolean

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

下面是我提取布尔值的方法:

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

根据,这正按预期工作:

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


我认为这是一个64位的值,因为这部分文档中的偏移参数为:

必须是8字节的倍数

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


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

这是我的错@warrenm,我不知怎么错过了这一段,并认为这是一本书。此外,本段没有正确描述要写入的数据类型。我向苹果公司提交了一个文档错误。谢谢你的报告。你能分享雷达号码吗?当然可以,是29512495。谢谢你的帮助。顺便说一下,关于非零值的文本不是我所期望的。它在“图形渲染:渲染命令编码器”下的“金属编程指南”中,但当您查找MTLVisibilityResultModeBoolean的参考时,它所说的只是指示样本是否通过深度和模具测试。@ldoogy嗨,您最终找到了正确的数据类型吗?文档仍然缺少数据类型描述。@文档现已更新,以正确指示数据类型。它是一个64位整数。是的,我从偏移量0读取。结合@warrenm的答案和您的答案,我们可以推断这可能是一个uin64\t,应该测试非零值。尽管如此,我还是认为这是缺乏文档的,因为当时并没有明确指定数据类型。
uint32 *resultBuffer = [visibilityResultBuffer contents];
BOOL result = (*resultBuffer != 0);