Objective c macOS上的金属:可见性测试行为不正确
在Metal中,当通过在命令编码器上调用setVisibilityResultMode来使用可见性结果功能时,我使用MTLVisibilityResultModeBoolean模式来获取一个布尔值,告诉我是否有任何片段通过了可见性测试 经过一段时间的努力,我注意到我并没有使用这个API得到布尔值。我似乎在数碎片的数量像素??通过了可视性测试。我也不确定这个计数器的长度:是32位吗?64位 实际上,这看起来像是MTLVisibilityResultModeCounting,但我确实指定了MTLVisibilityResultModeBoolean 这是金属臭虫吗?我担心这可能是我的笔记本电脑上的一个驱动程序错误,尽管它在我的MacBook Pro上的两个GPU(Radeon Pro 460和Intel HD Graphics 530)上都以相同的方式发生 下面是我提取布尔值的方法: 这在我的测试中正常工作,但我担心这可能无法在其他GPU/驱动程序上正常工作,因为它似乎与文档不匹配。任何人有什么想法吗?根据,这正按预期工作: 在MTLVisibilityResultModeBoolean模式下,当样本通过时 设备将非零值写入缓冲区。如果没有样品通过,则 设备写入零Objective c macOS上的金属:可见性测试行为不正确,objective-c,macos,metal,Objective C,Macos,Metal,在Metal中,当通过在命令编码器上调用setVisibilityResultMode来使用可见性结果功能时,我使用MTLVisibilityResultModeBoolean模式来获取一个布尔值,告诉我是否有任何片段通过了可见性测试 经过一段时间的努力,我注意到我并没有使用这个API得到布尔值。我似乎在数碎片的数量像素??通过了可视性测试。我也不确定这个计数器的长度:是32位吗?64位 实际上,这看起来像是MTLVisibilityResultModeCounting,但我确实指定了MTLVi
我认为这是一个64位的值,因为这部分文档中的偏移参数为: 必须是8字节的倍数 这种对齐通常仅对8字节64位类型是必需的。因此,您应该使用uint64而不是uint32
给定获取值的代码,我假设您使用的偏移量为0,对吗?否则,你读错地方了。这是我的错@warrenm,我不知怎么错过了这一段,并认为这是一本书。此外,本段没有正确描述要写入的数据类型。我向苹果公司提交了一个文档错误。谢谢你的报告。你能分享雷达号码吗?当然可以,是29512495。谢谢你的帮助。顺便说一下,关于非零值的文本不是我所期望的。它在“图形渲染:渲染命令编码器”下的“金属编程指南”中,但当您查找MTLVisibilityResultModeBoolean的参考时,它所说的只是指示样本是否通过深度和模具测试。@ldoogy嗨,您最终找到了正确的数据类型吗?文档仍然缺少数据类型描述。@文档现已更新,以正确指示数据类型。它是一个64位整数。是的,我从偏移量0读取。结合@warrenm的答案和您的答案,我们可以推断这可能是一个uin64\t,应该测试非零值。尽管如此,我还是认为这是缺乏文档的,因为当时并没有明确指定数据类型。
uint32 *resultBuffer = [visibilityResultBuffer contents];
BOOL result = (*resultBuffer != 0);