2010-05-03 81 views
2

當我設置glStencilFunc(GL_NEVER, . . .)有效地禁用所有繪圖,然後運行我的[shader-bound]程序時,我得到的性能並沒有超過讓片段着色器運行。我認爲模板測試發生在片段程序之前。情況並非如此,或者至少不能保證?用一個簡單地將常量寫入gl_FragColor的片段着色器代替片段着色器會產生更高的FPS。OpenGL模板測試在碎片程序運行之前還是之後發生?

回答

0

看看下面的大綱爲DX10流水線,它說,模板測試像素着色器之前運行:

http://3.bp.blogspot.com/_2YU3pmPHKN4/Sz_0vqlzrBI/AAAAAAAAAcg/CpDXxOB-r3U/s1600-h/D3D10CheatSheet.jpg

和相同的是真正的DX11:

http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG

我不知道這是在OpenGL規範中強制執行的,但是在運行片段程序之前執行不執行模板測試是不利的。

+0

根據此頁面:http://www.opengl.org/wiki/Rendering_Pipeline_Overview#Pipeline如果在片段着色器中未修改深度,則模板和深度測試可以在片段着色器之前運行。但是,這似乎並沒有發生在我的情況(我沒有寫入片段着色器中的gl_FragDepth)。 – david 2010-05-03 05:48:46

2

它實際上是兩個。每個片段操作應該在片段程序之後發生,如您在此OpenGL ES 2.0 pipeline diagram中所看到的。然而,只要你沒有寫入片段着色器的深度,許多現代圖形卡都有一個早期的z測試,可以提前丟棄這些片段。

這裏是paper from AMD/ATI that talks about such tests。我記得讀過規範允許早期測試,只要在着色器產生與之後的結果相同的結果之前進行測試,這就是爲什麼您不想在着色器中修改深度或丟棄片段的原因。這thread on OpenGL forums有一些有趣的討論。

2

除了碎片深度修改之外,還有一些其他的東西可以防止在片段着色器之前發生深度/模板測試。如果啓用了z-writes,則任何在着色器中放棄片段的方法都會執行此操作,例如alpha測試或着色器指令。

如果GPU想要在與z /模板寫入相同的操作中執行模板/ z測試,則必須等到片元着色器執行後才知道允許片段寫入z-緩衝。儘管這可能會因不同的卡而有所不同至少應該很容易判斷它是否是你當前的問題。

0

正如你所看到的: http://www.opengl.org/wiki/Stencil_Test 模板測試在fragmentShader之後運行。 我知道這對性能不好。

+0

這是答案或評論嗎? – 2012-12-18 08:28:32

相關問題