2014-10-16 50 views
2

如果我完全禁用深度測試時,遮擋查詢仍然有效,因爲當事先知道障礙物集合嚴格位於相機和待測試對象之間時? 這是一個嘗試提高性能,因爲從邏輯上說,如果沒有任何遮擋物位於occludee後面,我不需要複雜的z-測試。只有模板測試的遮擋查詢

我使用下面的命令來初始化顏色/深度/模板緩衝:

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 0); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 0); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 0); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); 
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); 
... 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 

glDisable(GL_CULL_FACE); 

glDisable(GL_DEPTH_TEST); 
glDepthMask(GL_FALSE); 

glEnable(GL_STENCIL_TEST); 
glStencilMask(0x00000001); 
... 
glClear(GL_STENCIL_BUFFER_BIT); 
+0

爲什麼不嘗試一下,並找出版本? – 2014-10-16 18:19:15

+0

遮擋查詢只對通過深度測試的樣本進行計數;模板緩衝區是無關緊要的。 HTTPS://www.opengl。org/wiki/Occlusion_Query#Occlusion_queries – 2014-10-16 18:47:11

+0

@ColonelThirtyTwo我不小心發佈了以前的評論。將在一秒鐘內重寫它。 – user2464424 2014-10-16 18:49:24

回答

2

最確鑿的文件是最新的OpenGL規範。從OpenGL 4.5規範中,第17.3節。7個遮擋查詢」,476頁上(強調由我加):

遮擋查詢使用查詢對象來跟蹤通過深度測試片段或樣本的數目

當閉塞。激活查詢,樣品,經過數累加爲通過深度測試每個片段

因此,真正的問題是:什麼是「通過深度測試」的意思是做了像素通的?深度t如果沒有深度測試,那麼可以稱爲?模板測試如何發揮作用?

關鍵是模板測試應用在深度測試之前,這是規範中定義的行爲。所以只有通過模板測試的片段纔會通過深度測試,因此將被計入遮擋查詢中。換句話說,只有通過模板和深度測試的片段才被計數。

確實可行的一種方法是啓用深度測試,並讓所有片段通過深度測試。然後這將計算所有通過模板測試的碎片。用於此設置是:

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_ALWAYS); 

glEnable(GL_STENCIL_TEST); 
... 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_ALWAYS); 

glEnable(GL_STENCIL_TEST); 
... 

現在,它是否也會按需工作,沒有深度緩衝區,或深度緩衝區禁用?這樣做的第一部分回答了在節「17.3.6深度緩衝測試」結束:

如果沒有深度緩衝,這是因爲如果深度緩衝測試總是通過

在這種情況下,答案是肯定的,您可以使用沒有深度緩衝區的遮擋查詢,並且它會計數通過模板測試的碎片。

第二種情況是前面部分覆蓋「17.3.6深度緩衝測試」:

禁用時,深度比較和隨後的可能的更新到深度緩衝器值被旁路和片段傳遞到下一個操作

規格中的圖17.1顯示「遮擋查詢」作爲「深度緩衝測試」後面的下一個操作。因此,如果深度測試被禁用,則通過較早測試(包括模板)的所有片段將由遮擋查詢計數。

而最終答案是:YES,您可以使用遮擋查詢只用模具測試。

致謝:最新修訂的基礎上反饋的@jozxyqk和@ user2464424

+0

我喜歡你的傳遞深度測試的解決方案,只是爲了使文檔更高興:我認爲它會起作用。只有考慮,正如jozxyqk所說:「通過深度測試,我會假設所有片段都通過了」,這在平均對象展示場景中是正確的(我在我的系統中嘗試過,三角形仍然呈現,但是隨機z-訂購)。這完全取決於如何編碼遮擋查詢。他們是否將禁用的深度緩衝區視爲等效的glDepthFunc(GL_ALWAYS)?它是製造商依賴的嗎?人類永遠不會知道。我會測試。 – user2464424 2014-10-17 09:09:33

+0

@ user2464424我的假設是計數器會在深度測試後插入渲染管道中。無論啓用深度測試還是計數器之前的任何先前測試,如果片段在管道的深度測試部分之後仍處於活動狀態,則會進行計數。也許[這些管道圖](http://openglinsights.com/pipeline.html)給出了一個更好的圖片。 – jozxyqk 2014-10-17 11:04:27

+0

@jozxyqk經過一番思考和挖掘,聽起來完全正確。我相信我發現所有的spec語言都支持這種行爲。請參閱上面的答案的徹底修訂版本。 – 2014-10-17 15:40:32

1

www.opengl.org/registry/specs/ARB/occlusion_query.txt

此擴展解決了這兩個的那些[HP_occlusion_test]問題。它返回它的 結果

...

究竟是什麼階段的管道是我們計算樣品在經過深度和模板測試樣本的數量?

已解決:我們在之後立即計數深度, 模板測試,即通過兩者的樣本。請注意,深度 測試是在模板測試之後進行的,所以說通過深度測試的數字是 就足夠了;儘管通常在 概念上有幫助,因爲深度測試的結果會影響 使用的模板操作,所以將深度和模板測試合併爲 。

www.opengl.org/registry/specs/ARB/occlusion_query2.txt

此擴展平凡增加了一個布爾遮擋查詢到ARB_occlusion_query

隨着深度測試關閉,我假定所有片段通過。 從上面聽起來像你可以依靠模板測試單獨影響遮擋查詢結果,這是從opengl.org/wiki以下不符合。

模板測試,阿爾法測試,或片段着色器丟棄無關與查詢

擴展沒有提到discard。 GL 4.5 core/compat規範中的遮擋查詢部分僅提到了通過深度測試的計數片段。 如果片段沒有進行深度測試,那麼我猜想它不被認爲通過它

有點旁註,但我認爲它也值得一提的early fragment test