在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 /驱动程序上正常工作,因为它似乎与文档不匹配。任何人的想法?
答案 0 :(得分:2)
根据documentation,这是按预期工作的:
在
MTLVisibilityResultModeBoolean
模式下,当样本通过时, 设备将非零值写入缓冲区。如果没有样品通过,那么 设备写入零。
答案 1 :(得分:1)
我认为它是64位值,因为-setVisibilityResultMode:offset:
的offset
参数的这部分文档:
必须是8个字节的倍数。
这种对齐通常仅对8字节(64位)类型是必需的。因此,您应该使用uint64_t
而不是uint32_t
。
鉴于您获取值的代码,我假设您使用的偏移量为0,是吗?否则,你是在错误的地方读书。