標籤:

現代gl編程一定比傳統固定管線快嗎?

我要實現一個三維引擎,顯示十萬級別三角面,發現有時候速度很慢。由於接觸gl比較早,只懂得傳統管線,糾結是否需要重新學習現代gl編程。

現代gl性能一定比傳統固定管線快嗎?

如果快的話能快多少呢?


是,一定快。快多少沒準,取決於程序本身。

DX9的GPU開始,就已經沒有硬體固定流水線了。你看到的只是驅動裡面的一個uber shader。渲染的時候驅動會根據渲染狀態定製那個uber shader,已達到「固定流水線」的效果。

好,那麼你自己應該也可以解答了。每次draw的時候

1) 根據狀態動態生成一遍shader

2) 一個巨大無比,上千行的shader

3) 自己預先寫好的shader,精確包含只有自己需要的東西

哪個快?1)是現在驅動的常見方案,2)是早期驅動的方案,3)是可編程流水線。

另外,一旦用了現在渲染方式,就有各種有助於提升性能的東西可用了。比如用一個8x4bit保存tangent frame,用16x2bit保存紋理坐標,在shader里解碼。這些都不是固定流水線搞得了的。


題主需要先了解兩個東西,一個叫做緩衝區對象,一個叫做可編程著色器。它們是傳統管線和現代管線最大差異所在。

緩衝區對象,包括VBO,IBO,UBO等,其主要的目的在於提前將數據傳輸到顯卡,避免每幀都傳送大量數據導致的瓶頸。在你的例子里,十萬級別的三角面,如果不用VBO傳輸頂點數據絕對是卡到爆。

渲染基本圖形,兩者沒有多少區別。但是基於可編程著色器的管線可以自己定製一些額外的效果,而不僅僅局限於傳統OpenGL提供的紋理映射,光照,霧等。

OpenGL SuperBible 新版已經去掉了傳統管線的內容。傳統管線被淘汰了,不要再用它。

=============

至於快多少,這個取決於很多因素,以上面討論的兩個方面為例:

1、減少了多少不必要的數據傳輸

2、對於傳統管線無法實現以至於必須通過CPU計算的高級效果。你用得越多,差異越大。


現在已經很少見到基於傳統管線設計的GPU了,即使支持傳統管線,也是在可編程管線上實現的。

另外,不要輕易懷疑一個比另一個好,你需要的是profiling數據,看看瓶頸究竟出在哪裡。以我的猜測,大概率出現在IO上


現在已經不用glbegin、glvertexXX、glend了,這套東西要為每一個頂點調用一次函數,而且要每一幀都傳一遍數據。

現在的做法是把數據傳到設備端的頂點緩存里,每次繪製引用緩存的數據。這同時減少了函數調用的代價和傳數據的代價。


推薦閱讀:

Opengl編程指南(紅寶書)第八版中文版怎麼樣,適合入門學習么?
如何正確理解 opengl 的 vao ?
Mac系統下配置OpenGL環境(小白自學版)
如何理解OpenGL中的backface culling以及圖形的正反面?
Nehe OpenGL 教程是否過時?

TAG:OpenGL |