在OpenGL中,任何事物都處在3D空間叔扼,而屏幕和窗口是2D像素組街氢。這導致OpenGL大部分時間都在處理把3D數(shù)據(jù)轉(zhuǎn)變?yōu)檫m應屏幕的2D像素。3D到2D的過程被稱為OpenGL的圖像渲染管線(即管線苫拍,實際上指的是一堆原始圖形數(shù)據(jù)途經(jīng)一個輸送管道芜繁,期間經(jīng)過各種變化處理最終出現(xiàn)在屏幕的過程)。
圖形渲染管線可以被劃分為幾個部分绒极,每個階段把前一階段的輸出當作自己的輸入骏令。每個階段都是高度專門化的,有特定的函數(shù)實現(xiàn)垄提,并且很容易并行執(zhí)行榔袋。正是由于它們具有并行執(zhí)行的特性,當今大多數(shù)顯卡都有成千上萬的小處理核心铡俐,它們在GPU上為每一個(渲染管線)階段運行各自的小程序凰兑,從而在圖形渲染管線中快速處理你的數(shù)據(jù)。這些小程序叫做著色器(Shader)审丘。
一吏够、頂點數(shù)據(jù)
一系列圖形頂點的集合。
有了頂點數(shù)據(jù)滩报,OpenGL其實還是不知道我們要做什么樣的圖形锅知。為了告訴OpenGL我們要做什么,我們會給這些數(shù)據(jù)指定一些渲染類型脓钾,到底是點售睹、三角形還是線。我們所給的這個提示被稱為圖元可训。常用的圖元有:GL_POINTS昌妹、GL_TRIANGLES捶枢、GL_LINE_STRIP。
這里的輸入采用的是標準化設備坐標捺宗,即xyz的值的范圍只能是在-1到1之間柱蟀。
二、頂點著色器
這是管線的第一部分蚜厉。它把一個單獨的頂點作為輸入长已,然后把這個3D坐標轉(zhuǎn)換為另一種3D坐標,同時開發(fā)人員還可以再做一些基礎處理昼牛。
三术瓮、圖元裝配
將頂點著色器輸出的的所有頂點作為輸入,并根據(jù)指定的圖元裝配成相應的圖形贰健。
四胞四、幾何著色器
將圖元裝配的輸出作為輸入,它可以通過產(chǎn)生新頂點構(gòu)造出新的(或是其它的)圖元來生成其他形狀
五伶椿、光柵化
把圖元映射為最終屏幕上相應的像素辜伟,生成供片段著色器(Fragment Shader)使用的片段(Fragment)。在片段著色器運行之前會執(zhí)行裁切(Clipping)脊另。裁切會丟棄超出你的視圖以外的所有像素导狡,用來提升執(zhí)行效率。
六偎痛、片段著色器
計算一個像素的最終顏色旱捧,這也是所有OpenGL高級效果產(chǎn)生的地方。通常踩麦,片段著色器包含3D場景的數(shù)據(jù)(比如光照枚赡、陰影、光的顏色等等)谓谦,這些數(shù)據(jù)可以被用來計算最終像素的顏色贫橙。
七、測試與混合
這個階段檢測片段的對應的深度(和模板(Stencil))值(后面會講)茁计,用它們來判斷這個像素是其它物體的前面還是后面料皇,決定是否應該丟棄。這個階段也會檢查alpha值(alpha值定義了一個物體的透明度)并對物體進行混合(Blend)星压。所以践剂,即使在片段著色器中計算出來了一個像素輸出的顏色,在渲染多個三角形的時候最后的像素顏色也可能完全不同娜膘。
在現(xiàn)代OpenGL中逊脯,我們必須定義至少一個頂點著色器和一個片段著色器(因為GPU中沒有默認的頂點/片段著色器)。
著色器:是運行在GPU上的小程序竣贪,這些小程序為圖形渲染管線的某個特定部分而運行
總結(jié)
整體的流程總結(jié)如下:
1军洼、初始化GLFW
2巩螃、配置GLFW
3、創(chuàng)建窗口對象GLFWwindow
4匕争、將創(chuàng)建的窗口對象設置為當前上下文context
5避乏、初始化GLEW
6、可視化窗口
7甘桑、圖形渲染管線:VAO拍皮、頂點數(shù)據(jù)、連接頂點屬性跑杭、啟用頂點屬性铆帽、VBO、Vertex Shader德谅、Fragment Shader爹橱、Shader Programe、刪除Shader
8窄做、繪制