這幾天稍微看了一些關(guān)于GLSL的頂點(diǎn)著色以及片元著色的一些相關(guān)知識(shí).目前來(lái)講還有一個(gè)著色器則是Geometry_shader..我的顯卡用不了這個(gè)功能..當(dāng)然有點(diǎn)遺憾>_<..
在看了一些之后,大概了解了一些關(guān)于OpenGL渲染管線(xiàn)的知識(shí).看了這個(gè)之后對(duì)于OpenGL的學(xué)習(xí)我想應(yīng)當(dāng)是很有幫助.關(guān)于這么一篇的原文則是GLSL-LIGHTSOURCE 教程一個(gè)開(kāi)篇部分.
原文地址:是英文的..我在osgchina教程論壇上也見(jiàn)到過(guò)FreeSouth大牛的中文翻譯..
關(guān)于渲染管線(xiàn)將什么呢?無(wú)非就是在OpenGL的管道當(dāng)中各個(gè)部分的功能以及如何在管道當(dāng)中形成了我們想要的最終的一幅圖.(像素).而管線(xiàn)當(dāng)中的操作可分為以下幾個(gè)部分:
階段1. 指定幾何對(duì)象.
如:點(diǎn) 線(xiàn) 三角形.等一些幾何圖元..OpenGL繪制幾何圖元的方法有以下三種:
<1> 一次一個(gè)頂點(diǎn).即使用glBegin() glVertex() glEnd() 指定幾何對(duì)象.
<2> 使用頂點(diǎn)數(shù)組..如glDrawArrays.glDrawElements.等.一次性的繪制大量圖元.
上面這兩種模式則是立即模式.即指定完圖元之后會(huì)被立即渲染.即將所有數(shù)據(jù)發(fā)往渲染管線(xiàn)后立即被渲染.
<3>顯示列表模式.它存儲(chǔ)于OpenGL服務(wù)端 (接收OpenGL命令的一端.) glNewList glEndList glCallList .
階段2 頂點(diǎn)處理操作: 不管以上的幾何對(duì)象是如何指定的,所有的幾何數(shù)據(jù)都將會(huì)經(jīng)過(guò)這個(gè)階段,這個(gè)階段負(fù)責(zé)的則是逐個(gè)頂點(diǎn)的操作.
在這個(gè)階段能做的工作則是:
1. 頂點(diǎn)變換...根據(jù)模型視圖和投影矩陣變換
2. 光照計(jì)算 法線(xiàn)變換(法線(xiàn)矩陣 是模型矩陣的左上角3*3的逆矩陣)和法線(xiàn)規(guī)格化
3. 紋理坐標(biāo)變換.(紋理矩陣)
4.材質(zhì)狀態(tài) 紋理坐標(biāo)生成?
而最重要的則是變換以及光照. 每個(gè)頂點(diǎn)在這個(gè)階段分別是單獨(dú)處理的.
這個(gè)階段所接收到的數(shù)據(jù)則是每個(gè)頂點(diǎn)的屬性特征..輸出則是變換后的頂點(diǎn)數(shù)據(jù).
階段3 圖元組裝 在頂點(diǎn)處理之后,頂點(diǎn)的全部屬性都已經(jīng)被確定 在這個(gè)階段頂點(diǎn)將會(huì)根據(jù)應(yīng)用程序送往的圖元規(guī)則.
GL_POINTS GL_TRIANGLES 等 將會(huì)被組裝成圖元
階段4 圖元處理(裁剪 消隱) <1>這個(gè)步驟第一個(gè)所做的應(yīng)當(dāng)是裁剪操作..會(huì)將圖元與用戶(hù)定義的裁剪平面 即glClipPlane 和模型投影矩陣所建立的視景比較. 這將會(huì)裁剪且丟棄位于視景和裁剪平面外部的圖元.不在予以處理.
<2> 其次.若是采用透視投影 那么.將會(huì)對(duì)每個(gè)頂點(diǎn)的x,y z坐標(biāo)分別除以w.
<3>緊接著 則是由視口變換將頂點(diǎn)坐標(biāo)變換至窗口坐標(biāo).
<4> 執(zhí)行消隱操作
階段5 柵格化操作 <1>由圖元處理傳遞過(guò)來(lái)的圖元數(shù)據(jù).在此將會(huì)被分解成更小的單元并對(duì)應(yīng)幀緩沖區(qū)的各個(gè)像素.這些單元被稱(chēng)之為 片元. 一個(gè)片元可能包含窗口左邊 深度 顏色 紋理坐標(biāo)等屬性.
<2> 片元的屬性則是圖元上頂點(diǎn)數(shù)據(jù)等
經(jīng)過(guò)插值而確定的..這里生成的片元將會(huì)包含主顏色和次顏色.
glShadeMode() 函數(shù)的作用將會(huì)這里體現(xiàn).即使用插值(平滑著色) 或者使用最后一個(gè)頂點(diǎn)顏色(平面著色)
<3> 點(diǎn)寬 線(xiàn)寬.多邊形模式,正面背面等一些特征也將是這階段發(fā)生作用.
<4> 反走樣也是這個(gè)階段起作用.
階段6 片元處理 <1>上紋理 通過(guò)紋理坐標(biāo)取得紋理內(nèi)存中相對(duì)應(yīng)的顏色
<2> 霧化 通過(guò)片元距離當(dāng)前視點(diǎn)位置修改顏色.
<3> 顏色匯總..(這個(gè)與混合完全不同概念.將(紋理,主定義的顏色,霧化的顏色,次顏色光照階段計(jì)算的顏色)匯總一起.
階段7 逐個(gè)片元的操作
<1> 所有的一些測(cè)試 像素所有權(quán) 剪切(glScissor) Alpha測(cè)試(glAlphaFunc) 模版測(cè)試(glStencilFunc)
深度測(cè)試 (glDephtFunc) 混合(glBlendFunc)
這些操作將會(huì)最后影響其在幀緩沖區(qū)的顏色值.
階段8 幀緩沖操作 <1>這個(gè)階段執(zhí)行幀緩沖的寫(xiě)入等操作等..最后產(chǎn)生了顯示出來(lái)的像素.
glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 等.將在這個(gè)階段影響寫(xiě)入的值.
以上只是討論OpenGL 圖元繪制的基本過(guò)程 那么基于像素圖像繪制.幾乎形同之上..只是在光柵化處理前的操作不一樣.即經(jīng)過(guò)像素解碼 像素傳輸.柵格化 最后形成片元...片元之后的處理完全一樣..
因此 在著色器編程領(lǐng)域..你將可實(shí)現(xiàn)
Vertex Shader 替換 頂點(diǎn)處理階段
Fragment Shader 替換 片元處理階段
Geometry Shader 替換 圖元組裝階段..因?yàn)檫@三個(gè)階段所決定都是最重要效果的階段..對(duì)于這些的可編程將帶來(lái)非常大的好處以及可控制的渲染!!
posted on 2009-08-23 20:23
米游 閱讀(8863)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
OpenGL/OSG