從OpenGL ES 2.0開始就已經(jīng)告別了固定管線,之后就實(shí)現(xiàn)了可編程的圖形管線,下面這張圖是OpenGL ES 2.0的渲染流程:

固定管線 VS 可編程管線
其中灰色的部分是頂點(diǎn)著色器和片段著色器,是可以編程的部分。在之前的固定管線的時(shí)代,頂點(diǎn)的變化只能是可選的狀態(tài)的改變,功能比較有限,也無(wú)法進(jìn)行擴(kuò)展,比如我們渲染一個(gè)光照下面的球,渲染的樣式可能是下面這樣的:

而可編程管線來(lái)渲染,由程序來(lái)定義,可以執(zhí)行自定義計(jì)算,功能比較強(qiáng)大,擴(kuò)展性比較強(qiáng),能根據(jù)程序渲染出特別逼真的效果:

頂點(diǎn)著色器
頂點(diǎn)著色器是用來(lái)處理頂點(diǎn)的,它的輸入和輸出系統(tǒng)如下:


圖元裝配
圖元 (Primitive) 在OpenGL ES 中就是基本的繪圖對(duì)象,三角形、直線和點(diǎn),注意OpenGL ES中不能繪制多邊形。圖元的每個(gè)頂點(diǎn)來(lái)自頂點(diǎn)著色器的不同拷貝,在 圖元裝配期間,這些頂點(diǎn)被組合成圖元。
對(duì)于每個(gè)圖元,必須確定每個(gè)圖元是否位于屏幕上可見的3D空間區(qū)域內(nèi),如果沒有完全在,則需要進(jìn)行裁剪,如果圖元完全不在可視區(qū)域,就會(huì)被拋棄,裁剪和淘汰之后,頂點(diǎn)位置轉(zhuǎn)換成屏幕坐標(biāo),這時(shí)圖元就會(huì)準(zhǔn)備下一個(gè)階段---光柵化
光柵化
光柵化用來(lái)將圖元映射到像素設(shè)備,比如屏幕或者離線framebuffer,確定用多少像素表示圖元對(duì)象,經(jīng)過(guò)光柵化之后,會(huì)有鋸齒。
下圖是將一個(gè)三角形圖元,經(jīng)過(guò)光柵化之后:

光柵化將圖元轉(zhuǎn)化成一組
二維片段,然后這些二維片段由著色器處理,這些二維片段代表著可以在屏幕上繪制的像素。每個(gè)片段的輸出,屏幕坐標(biāo)(x, y)、顏色、紋理坐標(biāo)等屬性。
片段著色器
片段著色器為光柵化之后的片段上的操作實(shí)現(xiàn)了可編程。
片段著色器可以拋棄片段,也可以生成一個(gè)或者多個(gè)顏色值作為輸出,輸出最終的像素顏色


逐片段操作
在片段著色器之后,下一階段是逐片段操作。光柵化生成的屏幕坐標(biāo)為(x, y)的片段只能修改幀緩沖區(qū)中位置為(x, y)的像素

- 像素歸屬測(cè)試:這個(gè)測(cè)試用于確定幀緩沖區(qū)中的位置(x, y)的像素目前是不是歸OpenGL ES所有。例如,如果一個(gè)顯示OpenGL ES幀緩沖區(qū)窗口的窗口被另一個(gè)窗口所遮蔽,則窗口系統(tǒng)可以確定被遮蔽的像素不屬于OpenGL ES上下文,從而完全不顯示這些像素。像素歸屬測(cè)試是OpenGL ES 的一部分,但是不由自主開發(fā)人員來(lái)確定,在內(nèi)部進(jìn)行。
- 裁剪測(cè)試:把坐標(biāo)(x, y)的像素如果超出OpenGL ES的裁剪范圍,就會(huì)被拋棄。
-
模版測(cè)試:對(duì)輸入
Fragment Data的模版值進(jìn)行測(cè)試,看這個(gè)是否應(yīng)該拒絕 -
深度測(cè)試:對(duì)輸入
Fragment Data的深度值進(jìn)行測(cè)試,比如3D中的遠(yuǎn)近效果,查看Frame Buffer中的數(shù)據(jù)和當(dāng)前數(shù)據(jù)的深度進(jìn)行比較,遠(yuǎn)的丟掉,近的保留 -
混合:將輸入
Fragment Data中的顏色值 和 保存在Frame Buffer中的顏色值,進(jìn)行混合 - 抖動(dòng):用于因?yàn)槭褂糜邢薜木戎翟趲彌_中保存顏色而產(chǎn)生的偽像
在經(jīng)過(guò)逐片段操作之后,片段要么被拒絕,要么在幀緩沖區(qū)Frame Buffer的(x, y )的位置寫入片段的顏色、深度或者模版。如果啟動(dòng)了相應(yīng)的掩碼,可以更精確的控制寫入,比如,設(shè)置顏色緩沖區(qū)寫入掩碼,任何紅色的顏色值都不被寫入顏色緩沖區(qū)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 第三章 管線一覽 本章我們會(huì)學(xué)到什么 OpenGL管線的每個(gè)階段做什么的 如果連接著色器和固定功能管線階段 如果創(chuàng)...
- 版本記錄 前言 OpenGL ES是一個(gè)強(qiáng)大的圖形庫(kù),是跨平臺(tái)的圖形API,屬于OpenGL的一個(gè)簡(jiǎn)化版本。iOS...
- 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識(shí)體系,同時(shí)積累實(shí)際應(yīng)用經(jīng)驗(yàn)。因此有了從使用AVFounda...
- 目錄結(jié)構(gòu): 第一步,明確要干嘛 第二步,怎么去畫(純理論) 第三步,怎么去畫(實(shí)戰(zhàn)) 第四步,練練手 第一步,明確...
- 窯灣古鎮(zhèn)位于新沂市西南邊緣,京杭大運(yùn)河及駱馬湖交匯處。與宿遷、睢寧、邳州三市縣相連,是一座具有千年歷史、聞名全國(guó)的...