一沛贪、名詞解析:
1. Context(上下文):
調(diào)用OpenGL之前需要?jiǎng)?chuàng)建一個(gè)context上下文,context就是一個(gè)狀態(tài)機(jī)
震贵,記錄OpenGL中各種配置的狀態(tài)利赋。
- 狀態(tài)機(jī):
- 有記憶功能,能記住當(dāng)前的狀態(tài)猩系;
- 可以接收輸入隐砸,根據(jù)輸入的內(nèi)容和當(dāng)前狀態(tài),改變自己的狀態(tài)蝙眶,并產(chǎn)生輸出季希;
- 當(dāng)進(jìn)入特殊狀態(tài)(停機(jī)狀態(tài)),便不再接收輸入幽纷,停止工作式塌。
- OpenGL狀態(tài)機(jī):
- 可以記錄當(dāng)前的狀態(tài)(比如使用的顏色、是否開啟混合等)友浸;
- 可以接收輸入(如調(diào)用OpenGL的函數(shù)進(jìn)行傳參)峰尝;
- 可以進(jìn)入停止?fàn)顟B(tài),不再接收輸入收恢。
2. 渲染:
將圖形武学、圖像顯示在屏幕上的過(guò)程就是渲染(Rendering)。
3. 頂點(diǎn)數(shù)組(VertexArray)伦意、頂點(diǎn)緩沖區(qū)(VertexBuffer):
- 圖形圖像的頂點(diǎn)位置數(shù)據(jù)的數(shù)組存儲(chǔ)在內(nèi)存中火窒,這就是頂點(diǎn)數(shù)組;
- 渲染過(guò)程中驮肉,在內(nèi)存中獲取頂點(diǎn)數(shù)據(jù)效率低熏矿,所以更高效的做法是存儲(chǔ)在顯存中,這就是頂點(diǎn)緩沖區(qū)。
4. 著色器(Shader):
著色器就是對(duì)GPU編程的代碼段票编,類似于平時(shí)寫的函數(shù)(對(duì)CPU編程的代碼段)褪储。
- 分類:
- 頂點(diǎn)著色器(VertexShader)
- 片元著色器(FragmentShader)/像素著色器(PixelShader): 這兩種名稱只是在OpenGL和DirectX中的不同叫法而已。
- 幾何著色器(GeometryShader)
- 曲面細(xì)分著色器(TessellationShader)
- OpenGL在處理Shader時(shí)慧域,和其他編譯器一樣鲤竹。通過(guò)編譯、鏈接等步驟生成著色器程序(glProgram)昔榴,著色器程序同時(shí)包含頂點(diǎn)著色器和片元著色器的運(yùn)算邏輯宛裕。OpenGL進(jìn)行繪制時(shí):
- 首先由頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算;
- 再通過(guò)圖元裝配论泛,將頂點(diǎn)轉(zhuǎn)換為圖元;
- 然后進(jìn)行光柵化蛹屿,將圖元這種矢量圖形屁奏,轉(zhuǎn)換為柵格化數(shù)據(jù);
- 最后错负,將柵格化數(shù)據(jù)傳入片元著色器進(jìn)行運(yùn)算坟瓢,片元著色器對(duì)柵格化數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算,并決定像素的顏色犹撒。
5. 管線:
OpenGL渲染圖形時(shí)折联,會(huì)經(jīng)歷一個(gè)一個(gè)的節(jié)點(diǎn),而且每個(gè)節(jié)點(diǎn)的先后順序是固定的识颊,類似于流水線诚镰,所以稱之為管線。
- 固定管線祥款、存儲(chǔ)著色器:早期的OpenGL版本清笨,內(nèi)置了很多固定的shader程序,開發(fā)者只需傳入相應(yīng)的參數(shù)刃跛,就能快速實(shí)現(xiàn)圖形渲染(也就是只能調(diào)用抠艾,無(wú)法自定義);
- 由于OpenGL的使用場(chǎng)景非常豐富桨昙,固定管線或存儲(chǔ)管線無(wú)法滿足現(xiàn)有的場(chǎng)景检号,這時(shí)將相關(guān)部分開放成可編程。
6. 頂點(diǎn)著色器(VertexShader):
- 一般用來(lái)處理圖形每個(gè)頂點(diǎn)的變換(平移蛙酪、旋轉(zhuǎn)齐苛、投影等);
- 頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性桂塞,且是逐頂點(diǎn)運(yùn)算的程序脸狸。每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行一次頂點(diǎn)著色器。頂點(diǎn)著色器是并行運(yùn)算,執(zhí)行過(guò)程中無(wú)法訪問(wèn)其他頂點(diǎn)數(shù)據(jù)炊甲;
- 一般來(lái)說(shuō)需要計(jì)算的頂點(diǎn)屬性包括頂點(diǎn)坐標(biāo)變換泥彤、逐頂點(diǎn)光照運(yùn)算等。
頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換為歸一化坐標(biāo)系的運(yùn)算卿啡,就是在這里發(fā)生
吟吝。
7. 片元著色器(FragmentShader):
- 一般用來(lái)處理圖形中每個(gè)像素點(diǎn)的顏色計(jì)算和填充;
- 片元著色器是OpenGL中用于計(jì)算片段(像素)顏色颈娜,且是逐像素運(yùn)算的程序剑逃。也就是說(shuō)每個(gè)像素都會(huì)執(zhí)行一次片元著色器,當(dāng)然也是并行執(zhí)行的官辽。
8. GLSL(OpenGL Shading Language):
OpenGL著色語(yǔ)言用來(lái)在OpenGL中著色編程的語(yǔ)言蛹磺,是在圖形卡的GPU(Graphic Processor Unit圖形處理單元)上執(zhí)行的,代替了固定的渲染管線的一部分同仆,使渲染管線中不同層次具有可編程性萤捆。比如視圖轉(zhuǎn)換、投影轉(zhuǎn)換等俗批。
GLSL的著色器代碼分成兩個(gè)部分:頂點(diǎn)著色器(VertexShader)和片元著色器(FragmentShader)俗或。
9. 光柵化(Rasterization):
- 是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過(guò)程,具有將圖轉(zhuǎn)換成一個(gè)個(gè)柵格組成的圖像的作用岁忘,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一個(gè)像素辛慰。
- 光柵化是將幾何圖元變?yōu)槎S圖像的過(guò)程。該過(guò)程包含兩部分操作:
- 決定窗口坐標(biāo)中哪些整型柵格區(qū)域被基本圖元占用(也就是確定圖形的像素范圍)干像;
- 分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域(也就是把顏色附著上去)帅腌。
- 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息,轉(zhuǎn)換為屏幕上用于對(duì)應(yīng)位置上的像素及用于填充像素的顏色麻汰,這個(gè)過(guò)程成為光柵化狞膘。這是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過(guò)程。
10. 紋理:
紋理可以理解為圖片什乙、位圖挽封。
11. 混合(Blending):
- 在測(cè)試階段之后,如果像素依然沒(méi)有被剔除臣镣,那么像素的顏色將會(huì)和幀緩沖區(qū)的顏色進(jìn)行混合辅愿,混合的算法可以通過(guò)OpenGL的函數(shù)進(jìn)行指定。也可以通過(guò)片元著色器進(jìn)行實(shí)現(xiàn)忆某,性能會(huì)比原生的混合算法差一些点待。
- 兩個(gè)半透明的顏色疊加在一起,就是顏色的混合行為弃舒,就會(huì)觸發(fā)
離屏渲染
癞埠。
12. 變換矩陣(Transformation):
用于圖形的平移状原、縮放、旋轉(zhuǎn)等變換苗踪。
13. 投影矩陣(Projection):
用于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)颠区,實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制。