一、渲染:計(jì)算機(jī)根據(jù)模型創(chuàng)建圖象。模型(或物體)是由幾何圖元構(gòu)成的,而幾何圖元是通過頂點(diǎn)來指定的。最終渲染的圖象由屏幕像素組成。像素(pixel)是顯示硬件能夠放置到屏幕上的最小的可視元素。有關(guān)像素的信息(如顏色)在系統(tǒng)內(nèi)存中被組織為位面(bitplane)。位面構(gòu)成了幀緩存(包含圖形顯示設(shè)備為控制屏幕上所有像素的顏色和亮度所需的信息)。
1、使用幾何圖元建立模型,從而得到物體的數(shù)學(xué)描述。(OpenGL將點(diǎn)、直線、多邊形、圖形和位圖視為圖元);
2、在三維空間排列物體,選擇觀察場景的有利位置;
3、計(jì)算所有物體的顏色。顏色可能是由應(yīng)用程序指定的、根據(jù)光照條件確定的、將問題粘貼到物體上得到的,也可能是上述多種操作的結(jié)果;
4、將物體的數(shù)學(xué)描述和相關(guān)的顏色信息轉(zhuǎn)換為屏幕像素,這被稱為光柵化。
當(dāng)我們把繪制的圖形傳遞給OpenGL后,OpenGL還要做許多才能完成3D空間到屏幕的投影。這一系列的過程稱為OpenGL渲染流水線。一般的渲染流水線過程有如下幾步: 顯示列表 求值程序 頂點(diǎn)操作 圖元裝配 像素操作 紋理裝配 光柵化 片斷操作
OpenGL工作流程圖:

也可以簡單的記為:

這是固定管線流程,但是其中頂點(diǎn)處理模塊和片元處理模塊對于應(yīng)用程序來說都是可編程的
OpenGL建立三維模型的基本步驟
從三維空間到二維平面,就如同用相機(jī)拍照一樣,通常都要經(jīng)歷以下幾個(gè)步驟(括號內(nèi)表示的是相應(yīng)的圖形學(xué)概念)
1 將相機(jī)置于三角架上,讓它對準(zhǔn)三維景物(視點(diǎn)變換,Viewing Transformation);
2 將三維物體放在適當(dāng)?shù)奈恢茫P妥儞Q,Modeling Transformation );
3 選擇相機(jī)鏡頭并調(diào)焦,使三維物體投影在二維膠片上(投影變換,Projection Transformation );
4 決定二維像片的大小(視口變換,Viewport Transformation )。
這樣,一個(gè)三維空間里的物體就可以用相應(yīng)的二維平面物體表示了,也就能在二維的計(jì)算機(jī)屏幕上正確顯示了。
二、 計(jì)算機(jī)圖形學(xué)中,存在一種管線結(jié)構(gòu),在概念上可以分為3個(gè)階段:應(yīng)用程序、幾何以及光柵。應(yīng)用程序包括:圖元數(shù)據(jù)遍歷,攝像機(jī)的移動(dòng),物體模型的動(dòng)畫移動(dòng),物體可見檢查,選擇細(xì)節(jié)等級(LOD);幾何主要包括:模型和視點(diǎn)變換,光照與著色,投影,裁減,屏幕映射;光柵為像素(Pixel)正確配色,以便繪制完整圖像,該階段進(jìn)行的都是單個(gè)像素的操作,每個(gè)像素的信息存儲在顏色緩沖器(color buffer或者frame buffer)中。值得注意的是:光照計(jì)算屬于幾何階段,因?yàn)楣庹沼?jì)算涉及視點(diǎn)、光源和物體的世界坐標(biāo),所以通常放在世界坐標(biāo)系中進(jìn)行計(jì)算;而霧化以及涉及物體透明度的計(jì)算屬于光柵化階段,因?yàn)樯鲜鰞煞N計(jì)算都需要深度值信息(Z值),而深度值是在幾何階段中計(jì)算,并傳遞到光柵階段的。
3D世界的大多數(shù)高層次方面操作右管線中應(yīng)用階段的應(yīng)用軟件負(fù)責(zé)管理,余下的兩個(gè)階段由OpenGL負(fù)責(zé)管理,頂顏色,光照,材質(zhì)三個(gè)輸入在光柵化前控制繪制管線的操作。光照和材質(zhì)不能單獨(dú)使用。頂點(diǎn)顏色,光源顏色,材質(zhì)顏色都有alpha值,它們的alpha經(jīng)過運(yùn)算最后會保存在光柵化后的圖元 中,也就是說它們的影響也就在上圖中紅色虛線上方。輸入是點(diǎn)(幾何坐標(biāo)、頂點(diǎn)顏色),矩陣,光照(光源,參數(shù)),材質(zhì),輸出是片元。紋理映射的過程的本質(zhì)是根據(jù)紋理信息對片元的再處理,這個(gè)過程可能改變片元的alpha值。輸入是片元,紋理(紋理坐標(biāo)、各種參數(shù)),輸出還是片元。 Alpha值最終通過Alpha混合階段影響繪制效果,輸入時(shí)片元,輸出是幀緩存顏色值。其管線流程如下圖:

【頂裝景投光 柵片 紋測混】
意思為:
頂:先在頂點(diǎn)處理器上計(jì)算每個(gè)頂點(diǎn)的屬性(包括坐標(biāo),顏色,法向量,紋坐標(biāo),以及其他屬性如反射方向,折射方向等屬性)
裝:根據(jù)圖元的裝配方式(虛線,實(shí)線,線寬,多邊形著色模式等參數(shù))將頂點(diǎn)裝配連接成各種圖元
景:根據(jù)設(shè)置好的透視視椎體,裁剪掉那些沒有在視椎體中的頂點(diǎn),他們不納入計(jì)算)
投:將視椎體中的景物投影到近裁面上,根據(jù)投影變換矩陣計(jì)算每個(gè)頂點(diǎn)的齊次投影坐標(biāo)
光:根據(jù)經(jīng)典光照模型公式,光源的位置,頂點(diǎn)的位置,頂點(diǎn)的法向量,眼睛的位置綜合計(jì)算每個(gè)點(diǎn)的光照顏色,光照公式自己去查)
至此:上面的這些階段就是"頂點(diǎn)處理程序"的流程
然后是中間的"柵片"階段,意為讓圖形硬件根據(jù)掃描線"柵出"(即線性插值計(jì)算)每個(gè)片元的顏色和法向量,紋坐標(biāo),這個(gè)過程是不可編程的.我們無法控制.
下面是"片元處理程序階段"
紋:指將紋理按照指定貼圖方式(GL_MODULATE,GL_DECAL,GL_REPLACE)貼到每個(gè)片元上,計(jì)算出每個(gè)片元貼上紋理后的顏色
測:指對每個(gè)片元按順序進(jìn)行剪裁測試、alpha測試、模板測試、深度測試),所有測試通過的片元的顏色將寫入幀緩沖區(qū)中到屏幕顯示。
混:指在最后將片元顏色寫入幀緩沖區(qū)中的時(shí)候根據(jù)指定的混色方案如glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)將片元顏色與幀緩沖區(qū)顏色混合,OK,整個(gè)渲染流程就此結(jié)束了。
總結(jié):
1,在每對glBegin()與glEnd()之間即每個(gè)圖元都要經(jīng)過一個(gè)完整的渲染流程后才會執(zhí)行到下一條語句去。因此,在此期間可以屏蔽各種硬件緩沖以實(shí)現(xiàn)特殊的效果。
2,光柵化階段前面是頂點(diǎn)處理程序,后面是片元處理程序。但光柵欄化這個(gè)過程本身不可以自由控制。
opengl_api兼容模式
1.glDepthFunc();
The test function puts the incoming fragment's depth on the left of the equation and on the right is the depth from the depth buffer
物體的depth op z buffer
2.
glPushAttrib(GL_ALL_ATTRIB_BITS);
我們可以將多組屬性或者全部屬性(GL_ALL_ATTRIBUTE_BITS)通過函數(shù)glPushAttrib壓入屬性堆棧中,恢復(fù)則用glPopAttrib。
glPushAttrib()保存由mask指定的所有屬性,把它們壓入到屬性堆棧中。glPopAttrib()恢復(fù)上一次調(diào)用glPushAttrib()時(shí)所保存的狀態(tài)變量的值。當(dāng)glPopAttrib()函數(shù)被調(diào)用時(shí),所有這些變量的值都被恢復(fù)。特殊掩碼GL_ALL_ATTRIB_BITS用于保存和恢復(fù)所有屬性組中的所有狀態(tài)變量。
我遇到的問題是添加某種物體時(shí),物體的顏色會疊加到天空等物體上,使得天空顏色不正常顯示。通過
glPushAttrib(GL_ALL_ATTRIB_BITS)和 glPopAttrib();一組代碼,問題解決。
Description
glPushAttrib takes one argument, a mask that indicates which groups of state variables to save on the attribute stack. Symbolic constants are used to set bits in the mask. mask is typically constructed by ORing several of these constants together. The special mask GL_ALL_ATTRIB_BITS can be used to save all stackable states.
The symbolic mask constants and their associated GL state are as follows (the second column lists which attributes are saved):
glPopAttrib restores the values of the state variables saved with the last
glPushAttrib command. Those not saved are left unchanged.
It is an error to push attributes onto a full stack, or to pop attributes off an empty stack. In either case, the error flag is set and no other change is made to GL state.
Initially, the attribute stack is empty.
Notes
Not all values for GL state can be saved on the attribute stack. For example, render mode state, and select and feedback state cannot be saved. Client state must be saved with glPushClientAttrib.
The depth of the attribute stack depends on the implementation, but it must be at least 16.
When the GL_ARB_multitexture extension is supported, pushing and popping texture state apples to all supported texture units.
Errors
GL_STACK_OVERFLOW is generated if glPushAttrib is called while the attribute stack is full.
GL_STACK_UNDERFLOW is generated if glPopAttrib is called while the attribute stack is empty.
GL_INVALID_OPERATION is generated if glPushAttrib or glPopAttrib is executed between the execution of glBegin and the corresponding execution of glEnd.
Associated Gets
glGet with argument GL_ATTRIB_STACK_DEPTH
glGet with argument GL_MAX_ATTRIB_STACK_DEPTH