本文是基于凡幾多文章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ù)的處理流程

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)著色器(包括細(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)象

開啟深度測(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)圖如下

在整個(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ù)更新。