日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

渲染管线的理解

發布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 渲染管线的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖形渲染管線可以被劃分為兩個主要部分:

第一部分把你的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)。*所以,即使在片段著色器中計算出來了一個像素輸出的顏色,在渲染多個三角形的時候最后的像素顏色也可能完全不同。*/ }

?

?

總結

以上是生活随笔為你收集整理的渲染管线的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。