渲染管线的理解
圖形渲染管線可以被劃分為兩個主要部分:
第一部分把你的3D坐標轉換為2D坐標,第二部分是把2D坐標轉變為實際的有顏色的像素。
著色器(Shader):
圖形渲染管線接受一組3D坐標,然后把它們轉變為你屏幕上的有色2D像素輸出。圖形渲染管線可以被劃分為幾個階段,每個階段將會把前一個階段的輸出作為輸入。所有這些階段都是高度專門化的(它們都有一個特定的函數),并且很容易并行執行。正是由于它們具有并行執行的特性,當今大多數顯卡都有成千上萬的小處理核心,它們在GPU上為每一個(渲染管線)階段運行各自的小程序,從而在圖形渲染管線中快速處理你的數據。
圖形渲染管線的每個階段的抽象展示:
(注意藍色部分代表的是我們可以注入自定義的著色器的部分)
圖形渲染管線包含很多部分,每個部分都將在轉換頂點數據到最終像素這一過程中處理各自特定的階段。
偽代碼理解:
/** * 關于對渲染管線的理解 */int main() {//頂點數據float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f};VertexShader(vertices);return 0; }//1. 頂點著色 void VertexShader(float* vertices) {/***把一個單獨的頂點作為輸入。頂點著色器主要的目的是把3D坐標轉為另一種3D坐標,同時頂點著色器允許我們對頂點屬性進行一些基本處理。*/ShapeAssembly(); }//2. 圖元裝配 void ShapeAssembly() {/***將頂點著色器輸出的所有頂點作為輸入,并把所有的點裝配成指定圖元的形狀*/GeometryShader(); }//3. 幾何著色器 void GeometryShader() {/***把圖元形式的一系列頂點的集合作為輸入,它可以通過產生新頂點構造出新的(或是其它的)圖元來生成其他形狀*/Rasterization(); }//4. 光柵化 void Rasterization() {/***這里它會把圖元映射為最終屏幕上相應的像素,生成供片段著色器(Fragment Shader)使用的片段(Fragment)。*在片段著色器運行之前會執行裁切(Clipping)。*裁切會丟棄超出你的視圖以外的所有像素,用來提升執行效率。*/FragmentShader(); }//5. 片元著色器 void FragmentShader() {/***這里主要目的是計算一個像素的最終顏色,這也是所有OpenGL高級效果產生的地方。*通常,片段著色器包含3D場景的數據(比如光照、陰影、光的顏色等等),這些數據可以被用來計算最終像素的顏色。*/TestAndBlending(); }//6. 測試與混合 void TestAndBlending() {/***Alpha測試和混合(Blending)階段*這個階段檢測片段的對應的深度(和模板(Stencil))值,用它們來判斷這個像素是其它物體的前面還是后面,決定是否應該丟棄。*這個階段也會檢查alpha值(alpha值定義了一個物體的透明度)并對物體進行混合(Blend)。*所以,即使在片段著色器中計算出來了一個像素輸出的顏色,在渲染多個三角形的時候最后的像素顏色也可能完全不同。*/ }?
?
總結
- 上一篇: Django构建数据库缓存
- 下一篇: android 视频整合,Android