2016-12-05 58 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