OpenGL 渲染流程圖解析學(xué)習(xí)筆記

本文是基于凡幾多文章OpenGL基礎(chǔ)渲染進(jìn)行的二次學(xué)習(xí)筆記

1.什么是管線

管線來(lái)源于Rendering Pipeline的翻譯。但是關(guān)于這個(gè)翻譯,之前就有大佬吐槽過(guò),Pipeline應(yīng)該翻譯成工廠流水線更合適,因?yàn)槲覀冊(cè)谑褂肦endering Pipeline的目的是處理和組裝圖形數(shù)據(jù),就像在工廠流水線上組裝一樣。Rendering Pipeline的作用在于提供一套API的組合,使用這套API生成并處理圖形數(shù)據(jù),并將圖形數(shù)據(jù)提交給硬件執(zhí)行渲染。

所以通常對(duì)OpenGL渲染管線的理解應(yīng)該是

一套固定的API,通過(guò)這套API,組裝圖形渲染數(shù)據(jù),并將數(shù)據(jù)提交給計(jì)算機(jī)硬件執(zhí)行渲染

關(guān)于圖像數(shù)據(jù)結(jié)構(gòu)參考
圖像數(shù)據(jù)結(jié)構(gòu)

2 著色器

2.1 什么是著色器

通過(guò)上面的圖,發(fā)現(xiàn)渲染過(guò)程中,包含許多的著色器。著色器是渲染管線的基本處理單元。OpenGL封裝了一系列著色器用來(lái)處理圖形數(shù)據(jù),并且在一些其他工具類的幫助下共同完成圖形數(shù)據(jù)的組合生成。所以關(guān)于著色器的理解為:

著色器是使用GLSL編寫的,分別用于處理不同圖形圖像數(shù)據(jù)的一類工具程序的統(tǒng)稱

  • 關(guān)于著色器,需要強(qiáng)調(diào)的是,著色器階段只是用來(lái)組裝數(shù)據(jù)。并不直接參與圖形渲染

我們將參考OpenGL 4.3 版本的管線。管線處理流程圖 介紹主要著色器。并且介紹圖形數(shù)據(jù)的處理流程


image.png

2.2 頂點(diǎn)著色器

頂點(diǎn)著色器是用來(lái)處理從客戶端輸入的數(shù)據(jù),頂點(diǎn)著色器擅長(zhǎng)處理數(shù)學(xué)運(yùn)算,他的作用是用來(lái)處理從客戶端傳來(lái)的輸入數(shù)據(jù)。包括應(yīng)用矩陣運(yùn)算等數(shù)學(xué)計(jì)算來(lái)計(jì)算光照效果、位移、顏色值等。通常有多少數(shù)據(jù),頂點(diǎn)著色器就執(zhí)行多少次

頂點(diǎn)著色器Vertex Shader工作位置如圖

頂點(diǎn)著色器(包括細(xì)分和幾何著色)決定了一個(gè)圖元應(yīng)該位于屏幕的什么位置

通??梢岳斫鉃?,這些著色器提供了需要繪制圖形的起始信息。比如主要點(diǎn)的位置和數(shù)量

2.3 圖元設(shè)置

圖元設(shè)置本身并不屬于著色器。但是它作為一個(gè)工具類相關(guān)信息。起到和著色器類似的功能。所以講它歸類為著色器中介紹

以頂點(diǎn)著色器為例。頂點(diǎn)著色器提供了4個(gè)頂點(diǎn)信息。而需要講這四個(gè)點(diǎn)繪制成什么樣的圖形,就是由圖元設(shè)置來(lái)控制了。
具體信息參考
圖元
或者參考 原文 圖元部分

基本圖元信息類型如下

圖元類型 枚舉
點(diǎn) GL_POINTS
GL_LINES
條帶線 GL_LINE_STRIP
循環(huán)線 GL_LINE_LOOP
獨(dú)立三角形 GL_TRIANGLES
三角形條帶 GL_TRIANGLE_STRIP
三角形扇面 GL_TRIANGLE_FAN

2.4 光柵化

光柵化定義:

光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過(guò)程。片元中的每一個(gè)元素對(duì)應(yīng)于一個(gè)像素。

在完成圖元設(shè)置后。我們基本上也確定了不同繪制圖形的區(qū)域劃分。
光柵化的作用就是將這些區(qū)域數(shù)據(jù)進(jìn)行進(jìn)一步的拆分為一個(gè)一個(gè)柵格。并最終轉(zhuǎn)換為片元

通俗的理解就是將屏幕上的圖形都拆成一個(gè)一個(gè)的像素?cái)?shù)組。等待片元著色器為這些圖形貼上image

參考光柵化

2.5 片元著色器

作為渲染管線的出口。片元著色器是管線中決定最終顏色的功能。某個(gè)區(qū)域應(yīng)該填充什么顏色,都會(huì)在片元著色器中最終確定。由于光柵化中已經(jīng)將圖形拆分成一個(gè)一個(gè)的片元信息。也可以說(shuō)片元著色器決定某個(gè)片元的顏色應(yīng)該是什么。

片元著色器決定片元最終顏色,并且生成提交給硬件的圖像數(shù)據(jù)

片元著色器中除了決定顏色之外還包括很多功能。 包括顏色校正、后期處理、深度測(cè)試、顏色混合、顏色丟棄等功能都會(huì)在片元著色器中處理

我們以深度測(cè)試為例,來(lái)加深對(duì)片元著色器的了解

2.5.1深度測(cè)試

首先,我們的立體圖形經(jīng)過(guò)一系列的變換后。生成了一個(gè)3D數(shù)據(jù)模型,但是由于計(jì)算機(jī)屏幕只是一個(gè)2D屏幕,決定計(jì)算機(jī)屏幕上不可能渲染所有3D模型的點(diǎn)。所以需要開啟背面剔除來(lái)去除多余的圖像數(shù)據(jù)繪制防止出現(xiàn)錯(cuò)誤。但是由于背面剔除不能準(zhǔn)確的區(qū)分背面信息,就會(huì)會(huì)出現(xiàn)剔除多的現(xiàn)象

image.png

開啟深度測(cè)試。片元著色器會(huì)在每次提交的圖像數(shù)據(jù)結(jié)構(gòu)上新增一個(gè)gl_FragDepth值。標(biāo)明每次繪制像素的z軸的值。有了這個(gè)值。在渲染的時(shí)候,就能準(zhǔn)確的區(qū)分正面和反面

2.6 著色器小總結(jié)

  • 1 頂點(diǎn)著色器,用于處理數(shù)據(jù),決定視圖數(shù)據(jù)初始信息
  • 2 圖元設(shè)置區(qū)分不同的繪圖區(qū)域。決定圖形輪廓
  • 3 光柵化,將所有圖形像柵欄切割一樣,切割成不同的片元(像素)
  • 4 片元著色器最終決定每個(gè)像素點(diǎn)具體的渲染顏色以及相關(guān)信息,生成最終提交給硬件的數(shù)據(jù)信息

3 渲染管線過(guò)程中的數(shù)據(jù)流動(dòng)

渲染管線過(guò)程中數(shù)據(jù)流動(dòng)圖如下


著色器數(shù)據(jù)圖

在整個(gè)OpenGL渲染管線過(guò)程中,使用以下幾種數(shù)據(jù)

3.1Attributes 屬性

Attributes 屬性定義了0-15 16種格式數(shù)據(jù)。OpenGL 內(nèi)部定義了部分參數(shù)樣式,后續(xù)如果遇見會(huì)繼續(xù)更新

enum GLT_SHADER_ATTRIBUTE { 
           GLT_ATTRIBUTE_VERTEX = 0, 
          GLT_ATTRIBUTE_COLOR, 
          GLT_ATTRIBUTE_NORMAL,                                   
          GLT_ATTRIBUTE_TEXTURE0,
          GLT_ATTRIBUTE_TEXTURE1, 
          GLT_ATTRIBUTE_TEXTURE2, 
          GLT_ATTRIBUTE_TEXTURE3,                         
          GLT_ATTRIBUTE_LAST
};
標(biāo)識(shí)符 描述
GLT_ATTRIBUTE_VERTEX 3分量(x, y, z)頂點(diǎn)位置
GLT_ATTRIBUTE_COLOR 4分量(r, g, b, a)顏色值
GLT_ATTRIBUTE_NORMAL 3分量(x, y, z)表面法線
GLT_ATTRIBUTE_TEXTURE0 第一對(duì) 2 分量(s ,t)紋理坐標(biāo)
GLT_ATTRIBUTE_TEXTURE1 第二對(duì) 2 分量(s ,t)紋理坐標(biāo)

頂點(diǎn)著色器也能處理部分紋理信息。但是對(duì)應(yīng)紋理信息,應(yīng)該是符合屬性標(biāo)識(shí)的類型。這也就標(biāo)志,頂點(diǎn)著色器可能不能解析所有的圖片類型紋理。部分圖片紋理需要片元著色器進(jìn)行解析加載和計(jì)算。

3.2Uniform 標(biāo)識(shí)符

Uniform 也是OpenGL規(guī)定的數(shù)據(jù)統(tǒng)稱。

在固定管線中,提供給了一些封裝好的繪圖工具給開發(fā)者,即存儲(chǔ)著色器。通常我們通過(guò)使用Uniform標(biāo)識(shí)使用哪種著色器。著色器相關(guān)類型如下

enum GLT_STOCK_SHADER {
             GLT_SHADER_IDENTITY = 0, 
             GLT_SHADER_FLAT, 
             GLT_SHADER_SHADED, 
             GLT_SHADER_DEFAULT_LIGHT,         
             GLT_SHADER_POINT_LIGHT_DIFF,
             GLT_SHADER_TEXTURE_REPLACE,     
             GLT_SHADER_TEXTURE_MODULATE, 
             GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, 
             GLT_SHADER_TEXTURE_RECT_REPLACE,
             GLT_SHADER_LAST
 }
標(biāo)識(shí)符 著色器類型
GLT_SHADER_IDENTITY 單位著色器
GLT_SHADER_FLAT 平面著色器
GLT_SHADER_SHADED 上色著色器
GLT_SHADER_DEFAULT_LIGHT 默認(rèn)光源色器
GLT_SHADER_POINT_LIGHT_DIFF 點(diǎn)光源著色器
GLT_SHADER_TEXTURE_REPLACE 紋理替換著色器
GLT_SHADER_TEXTURE_MODULATE 紋理調(diào)整著色器
GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF 紋理光源著色器
GLT_SHADER_TEXTURE_RECT_REPLACE
GLT_SHADER_LAST

4 結(jié)語(yǔ)

本文是基于凡幾多文章OpenGL基礎(chǔ)渲染進(jìn)行的OpenGL學(xué)習(xí)筆記。后續(xù)會(huì)附上代碼。初學(xué)OpenGL,有一些理解不到位甚至理解錯(cuò)誤的地方。如果有能幫忙指出的,不勝感謝!?。『罄m(xù)也將持續(xù)更新。

最后編輯于
?著作權(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)容