當我設置glStencilFunc(GL_NEVER, . . .)
有效地禁用所有繪圖,然後運行我的[shader-bound]程序時,我得到的性能並沒有超過讓片段着色器運行。我認爲模板測試發生在片段程序之前。情況並非如此,或者至少不能保證?用一個簡單地將常量寫入gl_FragColor的片段着色器代替片段着色器會產生更高的FPS。OpenGL模板測試在碎片程序運行之前還是之後發生?
回答
看看下面的大綱爲DX10流水線,它說,模板測試像素着色器之前運行:
和相同的是真正的DX11:
http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG
我不知道這是在OpenGL規範中強制執行的,但是在運行片段程序之前執行不執行模板測試是不利的。
它實際上是兩個。每個片段操作應該在片段程序之後發生,如您在此OpenGL ES 2.0 pipeline diagram中所看到的。然而,只要你沒有寫入片段着色器的深度,許多現代圖形卡都有一個早期的z測試,可以提前丟棄這些片段。
這裏是paper from AMD/ATI that talks about such tests。我記得讀過規範允許早期測試,只要在着色器產生與之後的結果相同的結果之前進行測試,這就是爲什麼您不想在着色器中修改深度或丟棄片段的原因。這thread on OpenGL forums有一些有趣的討論。
除了碎片深度修改之外,還有一些其他的東西可以防止在片段着色器之前發生深度/模板測試。如果啓用了z-writes,則任何在着色器中放棄片段的方法都會執行此操作,例如alpha測試或着色器指令。
如果GPU想要在與z /模板寫入相同的操作中執行模板/ z測試,則必須等到片元着色器執行後才知道允許片段寫入z-緩衝。儘管這可能會因不同的卡而有所不同至少應該很容易判斷它是否是你當前的問題。
正如你所看到的: http://www.opengl.org/wiki/Stencil_Test 模板測試在fragmentShader之後運行。 我知道這對性能不好。
這是答案或評論嗎? – 2012-12-18 08:28:32
- 1. Java Stream'peek'是在終端操作之前還是之後發生?
- 2. 調試信息:之前還是之後?
- 3. 單元測試。在創建界面之前還是之後?
- 4. npm運行測試之前生成
- 5. OpenGL/GLUT:glTranslatef和glRotatef在繪製立方體之前還是之後?
- 6. 在py.test的每個測試之前和之後運行代碼?
- 7. 檢測鼠標單擊是在元素之前還是之後
- 8. Const在CGFloat之前還是之後?
- 9. Grails測試 - 在完整測試階段之前/之後運行代碼
- 10. 如何在'測試'之前運行「包」
- 11. 在sbt-native-packager之前運行測試
- 12. 如何在程序之前運行測試?
- 13. 在e-2-e測試之前運行角度應用程序
- 14. 地址是在它之後還是之前執行?
- 15. 「onscroll」在重繪之後還是之前發射?
- 16. Inotify在刪除之前還是之後觸發IN_DELETE?
- 17. FileSystemWatcher.Filter - 緩衝區之前還是之後?
- 18. 在絕對執行的所有測試之前和之後運行代碼
- 19. DoFilter()在Servlet的工作完成之前還是之後執行?
- 20. 安裝Rails之前的測試運行
- 21. Grails的創業板測試失敗在之後的運行
- 22. 發佈軟件之前的測試程序是什麼?
- 23. 發佈之前測試AdMob
- 24. 爲什麼我的測試數據庫在運行rails測試之前和之後都是空的?
- 25. Angular.js單元測試「inject()」在「運行」階段塊之前觸發
- 26. 在任何其他測試之前運行的Symfony測試?
- 27. 我可以在所有測試之前/之後執行操作
- 28. JUnit @Before和@After在每次測試之前和之後執行
- 29. 在InSpec測試之前或之後執行命令
- 30. 如何在業務中的每個測試之前(或之後)運行代碼
根據此頁面:http://www.opengl.org/wiki/Rendering_Pipeline_Overview#Pipeline如果在片段着色器中未修改深度,則模板和深度測試可以在片段着色器之前運行。但是,這似乎並沒有發生在我的情況(我沒有寫入片段着色器中的gl_FragDepth)。 – david 2010-05-03 05:48:46