2.1.4 坐標系統(tǒng)工具箱
窗口大小變化時懂昂,在glutReshapeFunc()中注冊的漢莎會被調(diào)用,在回調(diào)函數(shù)中,完成下列任務:
重新建立一個矩形區(qū)域档押,把它作為新的渲染畫布琳骡。
定義一個用于繪制物體的坐標系統(tǒng)锅论。
2.1.5 點,線楣号,多邊形
點:所有的頂點都是用4個浮點坐標值來表示的(x,y,z,w)w默認是1.0.
線:直線這個術(shù)語一般表示一段線段最易。
多邊形:幾個點連在一起就是一個多邊形,可以填充內(nèi)部炫狱,也可以只繪制邊框藻懒。
矩形:OpenGL特別提供了填充矩形圖元函數(shù)glRect*(),
void glRect {sifd}(TYPE x1,TYPE y1,TYPE x1,TYPE y1);繪制由(x1,y1),(x2,y2)構(gòu)成矩形,并且與x軸和y軸平行视译。
glVertex3d(GLdouble x, <#GLdouble y#>, <#GLdouble z#>) 表示一個頂點坐標
如下代碼繪制一個多邊形
void RenderScene(void)
{
glBegin(GL_POLYGON);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, .5);
glVertex2f(.3, .7);
glVertex2f(.45, .5);
glVertex2f(.6, 0.3);
glEnd();
glutSwapBuffers();
}
在opengl中只有點線和三角形嬉荆,一些復雜的圖形都是由他們堆砌而成。
將輸入圖元的數(shù)學描述轉(zhuǎn)化為與屏幕位置對應的像素片元的過程稱為光柵化酷含。
渲染(render):計算機從模型創(chuàng)建最終圖像的過程鄙早。
OpenGL 另一個最本質(zhì)的概念叫做著色器汪茧,它是圖形硬件設備所執(zhí)行的一類特殊函數(shù)。 理解著色器最好的方法是把它看做專為圖形處理單元(通常也叫做 GPU)編譯的一種小型程序限番。
在 OpenGL 中陆爽,會用到四種不同的著色階段(shader stage)。其中最常用的包括 的頂點著色器(vertex shader)以及片元著色器扳缕,前 者用于處理頂點數(shù)據(jù)慌闭,后者用于處理光柵化后的片元數(shù)據(jù)。
像素(pixel)是顯示器上最小的可見單元躯舔。計 算機系統(tǒng)將所有的像素保存到幀緩存(framebuffer) 當中驴剔,后者是由圖形硬件設備管理的一塊獨立內(nèi)存 區(qū)域,可以直接映射到最終的顯示設備上粥庄。
OpenGL語法
OpenGL 庫 中 所 有 的 函 數(shù) 都 會 以 字 符“ gl ” 作 為 前 綴丧失,然后是一個或者多個大寫字母開頭的詞組,以此來命名一個完整的函數(shù)惜互。OpenGL 庫中定義的常量也是 GL_COLOR_BUFFER_BIT 的形 式布讹,如 display() 函數(shù)中所示。所有的常量都以 GL_ 作為前綴训堆,并且使用下劃線來分隔單詞描验。為了能夠方便地在不同的操作系統(tǒng)之間移植 OpenGL 程序,OpenGL 還為函數(shù)定義了 不同的數(shù)據(jù)類型坑鱼,例如 GLfloat 是浮點數(shù)類型膘流。
OpenGL 渲染管線
著色器是專門為gpu編譯的小型應用程序,而渲染管線指的是數(shù)據(jù)處理過程鲁沥,可以看做一個流水線呼股,首先接受頂點數(shù)據(jù),然后由頂點著色器處理画恰,生成圖元彭谁,再經(jīng)過細分著色器,幾何著色器允扇,進行圖元設置缠局,裁剪,光柵化處理(輸入的數(shù)據(jù)轉(zhuǎn)換成屏幕位置對應的像素點)生成片元數(shù)據(jù)蔼两,送給片元著色器處理甩鳄。
- 準備向 OpenGL 傳輸數(shù)據(jù)
OpenGL需要把數(shù)據(jù)保存到緩存對象中,它相當于OpenGL管理的一塊內(nèi)存區(qū)域额划。 - 將數(shù)據(jù)傳輸?shù)?OpenGL
OpenGL數(shù)據(jù)初始化完成妙啃,需要調(diào)用一個繪制命令來請求渲染幾何圖元。glDrawArrays() 就是一個常用的繪制命令。 - 頂點著色
對于每一個頂點揖赴,都會有一個頂點著色器來專門處理此頂點相關(guān)的數(shù)據(jù)馆匿。可能進行一些復雜的操作(矩陣變換等)來得到頂點在屏幕上的位置燥滑。 - 細分著色
使用patch描繪物體的形狀渐北,生成最終的形狀。
-幾何著色
進一步細化铭拧。 - 圖元裝配
前面介紹的著色階段所處理的都是頂點數(shù)據(jù)赃蛛,此外這些頂點之間如何構(gòu)成幾何圖元的所有信息也會被傳遞到OpenGL中,圖元裝配階段將這些頂點以及相關(guān)的幾何圖元組織起來搀菩。 - 剪切
視口是我們可以進行繪制的窗口區(qū)域呕臂,有的頂點落在視口之外,與之相關(guān)的圖元會做出改動肪跋,保證相關(guān)的像素不在窗口之外繪制歧蒋。 - 光柵化
更新后的圖元轉(zhuǎn)化成片元,片元可以視為一個”候補的像素“州既,也就是可以放在幀緩沖中的像素谜洽。 - 片元著色
通過編程來控制屏幕上顯示顏色的階段。
我們可以用這種方法來理解頂點著色器和片元著色器的區(qū)別:頂點著色(包括細分和幾何著色)決定了一個圖元應該在屏幕的什么位置吴叶,而片元著色使用這些信息來決定某個片元的顏色應該是什么顏色阐虚。
- 逐片化的操作
使用深度測試和模板測試來決定一個片元是否可見。