因為工作原因,有一段時間沒玩opengl了。今天開始重新拾起。這一年來接觸了些opengl/es的chip provider,感覺大家都開始發力了,mobile 3d產業要爆發了。
之前一直在看1.x系列,現在從2.x開始,雖然1.x還有不少內容沒玩過。
2.x系列最大的變化就是引入了可程式設計pipeline,相對於1.x的固定pipeline來說要靈活很多,具體一點比始光照,在2.x可以做得更逼真。所謂可程式設計是指頂點處理和片段處理兩個部分可以程式設計,其它部分可否程式設計?有沒有程式設計的必要?這些問題還是留給高人回答吧,我只是個初學者。
可程式設計的器件稱為shader,包括頂點(vertex)shader和片段(fragment)shader。shader的乙個中文翻譯是著色器。
既然是程式設計,那就存在語言,opengl定義的shader語言稱為glsl(opengl shadering language)。glsl的語法和c差不多,glsl提供了一些內建函式和變數用於控制opengl狀態機。
用glsl所寫的shader**,需要在執行時由目標機來編譯,什麼意思呢?就是需要在整體程式執行起來之後,在程式裡呼叫乙個函式來完成對glsl的編譯。當然,我猜想要做到靜態編譯是沒有問題的,只是glsl沒有定義二進位制的標準,所以這個工具很可能是由各廠商自己提供。
以下是編寫乙個2.x程式所需要做的初始化工作,與1.x類似的就不列舉了,
1. 建立shader物件,一般要建立兩個shader,即vertex shader,fragment shader
2. 將glsl原始碼裝載至shader
3. 編譯原始碼
4. 建立program物件
5. 將shader與program繫結
6. 將program內的各shader鏈結,使program處於可執行狀態
7. 將program裝載至pipeline中
以下是上述過程所對應的原始碼,
v = glcreateshader(gl_vertex_shader);
f = glcreateshader(gl_fragment_shader);
//由fread將shader原始碼讀入vv, vv是char*型別
glshadersource(v, 1, &vv,null);
glshadersource(f, 1, &ff,null);
glcompileshader(v);
glcompileshader(f);
p = glcreateprogram();
glattachshader(p,v);
glattachshader(p,f);
gllinkprogram(p);
gluseprogram(p);
...
OpenGL學習隨筆 四
久違了,我的blog。這幾天被透視投影卡住了,雖然到現在也沒有完全搞明白,但也還是應該階段性總結一下。3d影象在2d平面顯示要經過以下幾個步驟,1.資料配置環節,配置頂點 顏色等資料,確定了物體的大小和外觀。2.指定模型視點變換引數,將物體到3d場景中,並確定我們的觀察點,也就是人眼的位置。3.指定...
OpenGL學習隨筆 七
很多時候,知識難以常握是因為我們只知其表不知其裡,或者說不了解歷史就不能理解現在。所以在學習到一定程度之後一定要去分析和實現opengl,之後才能真正理解和掌握opengl。每天在不斷學習新的內容時,我都會選擇重寫測試 而不是在之前的 上修改,原因是想找出一些思維定勢和盲區。今天嘗試用push和po...
opengl 入門學習 隨筆五
今天開始opengl的學習,下面上第乙個程式!void mydisplay int main int argc,char argv 整個程式表示顯示乙個矩形 這裡有幾個概念稍微介紹一下 1 glclear 表示清除背景,也就是說我們在黑板上清除的效果是顯示全黑,在白紙上清楚顯示的是全白 2 glut...