我的OpenGL ES學(xué)習(xí)之路(四):渲染流程

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


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)如下:

頂點(diǎn)著色器
頂點(diǎn)著色器程序?qū)嵗?/div>

圖元裝配

圖元 (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ū)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(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)容

友情鏈接更多精彩內(nèi)容