Opengl es2.0 學習筆記(二)渲染管線

      網友投稿 1080 2022-05-30

      opengl渲染管線

      文章目錄

      一、渲染管線

      二,頂點著色器

      三,片元著色器

      四,頂點著色與片元著色在編程上的差異

      一、渲染管線

      Vertex Array/Buffer objects:頂點數據來源,這時渲染管線的頂點輸入,通常使用 Buffer objects效率更好。

      Vertex Shader:頂點著色器通過可編程的方式實現對頂點的操作,如進行坐標空間轉換,計算 per-vertex color以及紋理坐標;

      Primitive Assembly:圖元裝配 經過著色器處理之后的頂點在圖片裝配階段被裝配為基本圖元。OpenGL ES 支持三種基本圖元:點,線和三角形,它們是可被 OpenGL ES 渲染的。接著對裝配好的圖元進行裁剪(clip):保留完全在視錐體中的圖元,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪;接著再對在視錐體中的圖元進行剔除處理**(cull):**這個過程可編碼來決定是剔除正面,背面還是全部剔除。

      Rasterization:光柵化。在光柵化階段,基本圖元被轉換為二維的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,顏色,紋理坐標等信息,這些值是由圖元的頂點信息進行插值計算得到的。這些片元接著被送到片元著色器中處理。這是從頂點數據到可渲染在顯示設備上的像素的質變過程。

      Fragment Shader:片元著色器通過可編程的方式實現對片元的操作。在這一階段它接受光柵化處理之后的fragment,color,深度值,模版值作為輸入。

      Per-Fragment Operation:在這一階段對片元著色器輸出的每一個片元進行一系列測試與處理,從而決定最終用于渲染的像素。這一系列處理過程如下:

      Pixel ownership test:該測試決定像素在 framebuffer 中的位置是不是為當前 OpenGL ES 所有。也就是說測試某個像素是否對用戶可見或者被重疊窗口所阻擋;

      Scissor Test:剪裁測試,判斷像素是否在由 glScissor 定義的剪裁矩形內,不在該剪裁區域內的像素就會被剪裁掉;

      Stencil Test:模版測試,將模版緩存中的值與一個參考值進行比較,從而進行相應的處理;

      Depth Test:深度測試,比較下一個片段與幀緩沖區中的片段的深度,從而決定哪一個像素在前面,哪一個像素被遮擋;

      Blending:混合,混合是將片段的顏色和幀緩沖區中已有的顏色值進行混合,并將混合所得的新值寫入幀緩沖;

      Dithering:抖動,抖動是使用有限的色彩讓你看到比實際圖象更多色彩的顯示方式,以緩解表示顏色的值的精度不夠大而導致的顏色劇變的問題。

      Framebuffer:這是流水線的最后一個階段,Framebuffer 中存儲這可以用于渲染到屏幕或紋理中的像素值,也可以從Framebuffer 中讀回像素值,但不能讀取其他值(如深度值,模版值等)。

      二,頂點著色器

      Attributes:由 vertext array 提供的頂點數據,如空間位置,法向量,紋理坐標以及頂點顏色,它是針對每一個頂點的數據。屬性只在頂點著色器中才有,片元著色器中沒有屬性。屬性可以理解為針對每一個頂點的輸入數據。OpenGL ES 2.0 規定了所有實現應該支持的最大屬性個數不能少于 8 個。

      Uniforms:uniforms保存由應用程序傳遞給著色器的只讀常量數據。在頂點著色器中,這些數據通常是變換矩陣,光照參數,顏色等。由 uniform 修飾符修飾的變量屬于全局變量,該全局性對頂點著色器與片元著色器均可見,也就是說,這兩個著色器如果被連接到同一個應用程序中,它們共享同一份 uniform 全局變量集。因此如果在這兩個著色器中都聲明了同名的 uniform 變量,要保證這對同名變量完全相同:同名+同類型,因為它們實際是同一個變量。此外,uniform 變量存儲在常量存儲區,因此限制了 uniform 變量的個數,OpenGL ES 2.0 也規定了所有實現應該支持的最大頂點著色器 uniform 變量個數不能少于 128 個,最大的片元著色器 uniform 變量個數不能少于 16 個。

      Samplers:一種特殊的 uniform,用于呈現紋理。sampler 可用于頂點著色器和片元著色器。

      Shader program:由 main 申明的一段程序源碼,描述在頂點上執行的操作:如坐標變換,計算光照公式來產生 per-vertex 顏色或計算紋理坐標。

      頂點著色器的輸出:

      Varying:varying 變量用于存儲頂點著色器的輸出數據,當然也存儲片元著色器的輸入數據,varying 變量最終會在光柵化處理階段被線性插值。頂點著色器如果聲明了 varying 變量,它必須被傳遞到片元著色器中才能進一步傳遞到下一階段,因此頂點著色器中聲明的 varying 變量都應在片元著色器中重新聲明同名同類型的 varying 變量。OpenGL ES 2.0 也規定了所有實現應該支持的最大 varying 變量個數不能少于 8 個。

      在頂點著色器階段至少應輸出位置信息-即內建變量:gl_Position,其它兩個可選的變量為:gl_FrontFacing 和 gl_PointSize。

      三,片元著色器

      片元管理器接受如下輸入:

      Varyings:這個在前面已經講過了,頂點著色器階段輸出的 varying 變量在光柵化階段被線性插值計算之后輸出到片元著色器中作為它的輸入,即上圖中的 gl_FragCoord,gl_FrontFacing 和 gl_PointCoord。OpenGL ES 2.0 也規定了所有實現應該支持的最大 varying 變量個數不能少于 8 個。

      Uniforms:前面也已經講過,這里是用于片元著色器的常量,如霧化參數,紋理參數等;OpenGL ES 2.0 也規定了所有實現應該支持的最大的片元著色器 uniform 變量個數不能少于 16 個。

      Samples:一種特殊的 uniform,用于呈現紋理。

      Shader program:由 main 申明的一段程序源碼,描述在片元上執行的操作。

      在頂點著色器階段只有唯一的 varying 輸出變量-即內建變量:gl_FragColor。

      四,頂點著色與片元著色在編程上的差異

      Opengl es2.0 學習筆記(二)渲染管線

      1,精度上的差異

      著色語言定了三種級別的精度:lowp, mediump, highp。我們可以在 glsl 腳本文件的開頭定義默認的精度。如下代碼定義在 float 類型默認使用 highp 級別的精度

      precision highp float;

      在頂點著色階段,如果沒有用戶自定義的默認精度,那么 int 和 float 都默認為 highp 級別;而在片元著色階段,如果沒有用戶自定義的默認精度,那么就真的沒有默認精度了,我們必須在每個變量前放置精度描述符。此外,OpenGL ES 2.0 標準也沒有強制要求所有實現在片元階段都支持 highp 精度的。我們可以通過查看是否定義 GL_FRAGMENT_PRECISION_HIGH 來判斷具體實現是否在片元著色器階段支持 highp 精度,從而編寫出可移植的代碼。當然,通常我們不需要在片元著色器階段使用 highp 級別的精度,推薦的做法是先使用 mediump 級別的精度,只有在效果不夠好的情況下再考慮 highp 精度。

      2,attribute 修飾符只可用于頂點著色。這個前面已經說過了。

      3,由于精度的不同,或因為編譯優化的原因,在頂點著色和片元著色階段同樣的計算可能會得到不同的結果,這會導致一些問題(z-fighting)。因此 glsl 引入了 invariant 修飾符來修飾在兩個著色階段的同一變量,確保同樣的計算會得到相同的值。

      Elasticsearch OpenGL 渲染

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:[工具使用]BurpSuite
      下一篇:MPI編程入門詳解
      相關文章
      亚洲AⅤ男人的天堂在线观看| 亚洲成人动漫在线观看| 亚洲美国产亚洲AV| 99久久婷婷国产综合亚洲| 亚洲精品无码久久久久久久| 久久亚洲AV无码精品色午夜| 亚洲精品成人av在线| 亚洲精品~无码抽插| 亚洲欧洲精品无码AV| 亚洲精品无码专区在线在线播放| 亚洲区不卡顿区在线观看| 亚洲人成无码www久久久| 亚洲午夜成人精品电影在线观看| 国产亚洲精彩视频| 成人亚洲网站www在线观看| 亚洲av成人片在线观看| 日本亚洲中午字幕乱码| 亚洲成a人片在线观看久| 亚洲日本韩国在线| 亚洲无av在线中文字幕| 国产精品亚洲аv无码播放| 国产偷v国产偷v亚洲高清| 亚洲大尺度无码专区尤物| 亚洲va在线va天堂va不卡下载 | 亚洲日本中文字幕| 久久亚洲精品无码aⅴ大香| 亚洲国产亚洲综合在线尤物| 亚洲一区二区三区深夜天堂| 77777午夜亚洲| 亚洲av无码专区首页| 亚洲麻豆精品国偷自产在线91| 国产成人精品久久亚洲高清不卡 | 国产亚洲精品不卡在线| 亚洲精品少妇30p| 亚洲天堂视频在线观看| 亚洲一卡二卡三卡四卡无卡麻豆| 日韩亚洲国产高清免费视频| 亚洲av日韩av永久在线观看| 亚洲视频一区二区| 亚洲成AV人片天堂网无码| 亚洲美女视频一区|