|
電腦遊戲製作開發設計論壇 任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
還是零分 散播福音的祭司
註冊時間: 2007-09-19 文章: 164
653.83 果凍幣
|
發表於: 2008-6-28, PM 1:03 星期六 文章主題: OpenGL入門教學(03) |
|
|
承接上上篇末尾的GLUT程式
現在說明每個函式的作用
那個Code分三個部分
main主程式和三個副程式WindowSize、Keyboard、Display
這篇要依序解釋
WindowSize
Keyboard
Display
三個副程式
//================================================================================
//WindowSize:
//隨時注意視窗的長寬是為了讓描繪內容隨著視窗一起變化
//================================================================================
//------glViewport(橫座標,縱座標,寬度,高度);
//
//想像OpenGL是一個畫家
//視窗就是它的畫框
//glViewport則是決定畫布的長寬大小
//畫布的size跟畫框不符是很糟糕的
//
//glViewport的前兩個參數是畫布左下角的視窗座標位置
//後兩個參數是畫布的size
--------------------------------------------------------------------------------
//------glMatrixMode(GL_PROJECTION);
//
//顧名思義是選擇矩陣模式的意思
//而且選的還是個投影矩陣
//
//之所以要扯到矩陣是因為3D繪圖是向量圖不是點陣圖
//畫面精緻的2D遊戲常常是點陣圖而不是向量圖(畫面不怎麼精緻的flash遊戲是向量圖)
//
//3D電腦圖學最重要的資料就是座標點了
//3D遊戲中的畫面都受到座標點的控制
//改變座標點就能改變整個三維世界
//
//所以矩陣是最適合3D向量繪圖的數學工具了
//大學中教矩陣的這門課是叫做線性代數,是代數學的分支(代數學對資料壓縮有所貢獻)
//
//而資料是立體的,螢幕卻是平面的
//有必要讓3維圖形化為2維平面
//那不就是投影矩陣了嗎?
//
//glMatrixMode(GL_PROJECTION)先選了投影矩陣模式
//這樣待會兒有個指令要放出一個矩陣給OpenGL才不會放錯地方
//(OpenGL還有另外兩種矩陣模式,總共有三個矩陣堆疊供三種矩陣模式使用)
--------------------------------------------------------------------------------
//------glLoadIdentity();
//
//glLoadIdentity是將OpenGL中的矩陣設為單位矩陣
//所謂的單位矩陣是矩陣乘法下的單位元素
//任何矩陣乘上單位矩陣都還是等於自己
//
//我不想提太多數學,這樣我會沒有放暑假的感覺
//總之glLoadIdentity()的作用是不希望之前的矩陣資料殘留到現在的運算
//如同遊戲畫面一樣,要不斷的清理,不能讓之前的遊戲畫面殘留
--------------------------------------------------------------------------------
//------glOrtho(左邊界,右邊界,下邊界,上邊界,近邊界,遠邊界);
//
//這個指令給了OpenGL一個正交投影矩陣
//正交是垂直的代名詞,一個垂直的投影如同陽光底下的影子一樣
//物體跟地面的距離不會影響大小,適合2D遊戲使用
//
//對於glOrtho()的參數
//你可以想像將一個箱子放到3維座標系的原點
//它左右邊的面被x軸貫穿,交了兩個點
//x值就是左右邊界
//箱子的六個面都交了一點
//六個點六個邊界,定義了箱子的範圍
//將箱子前後壓扁就是視窗上的樣子啦
--------------------------------------------------------------------------------
//------glMatrixMode(GL_MODELVIEW);
//
//把矩陣模式改成MODELVIEW(不知道該怎麼翻)
//在Display函式中還會再確認一次
//OpenGL的矩陣模式要盡量處於MODELVIEW模式
//glMatrixMode(GL_MODELVIEW)下一行的glLoadIdentity()這時清理的是MODELVIEW矩陣
//================================================================================
//Keyboard
//================================================================================
啊!
這個函式的內容在上一篇講過了
我再copy一遍好了
//void Keyboard(unsigned char , int, int );
//
//第一個參數得到你輸入的鍵碼
//後兩個參數是你按按鍵時,滑鼠的座標(是視窗座標不是螢幕座標)
以後會寫switch條件判斷式來依據不同的按鍵來執行各自的功能
長的像這樣
代碼: | void Keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'a':
執行按下a之後對應的指令;
break;
case 'b':
執行按下b之後對應的指令;
break;
case 'c':
執行按下c之後對應的指令;
break;
}
} |
//================================================================================
//Display:
//這裡是OpenGL的舞台
//其中有些指令其實對於這個code並沒有用處
//但是到後面還是鐵定會用到
//所以在第一篇的code裡就先寫入了
//================================================================================
//------glClearColor( 紅 , 綠 , 藍 , 透明色 );
//
//設定用來清理顏色緩衝區的顏色,避免畫面殘留
//只是設定而已,還沒動手清理
//參數值全是介於0到1之間的浮點數
--------------------------------------------------------------------------------
//------glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
//
//真正動手清理緩衝區
//GL_COLOR_BUFFER_BIT指定要清理顏色緩衝區
//GL_DEPTH_BUFFER_BIT指定要清理深度緩衝區(32位元)
//
//深度緩衝區是3D畫面會用到的
//用來做深度測試,目的是讓近的物體能擋到遠方的物體,這樣才符合現實
//不過這個程式還沒啟動深度測試
--------------------------------------------------------------------------------
//------gluLookAt( x1 , y1 , z1 , x2 , y2 , z2 , x3 , y3 , z3 );
//
//這是個glu函式,是用來幫助gl函式的
//glu的功能其實用gl就寫的出來,
//不過glu改良後的用法較方便且直觀
//
//這個函式像個攝影機一樣
//可以調整攝影機的位置、調整攝影機的方向
//
//gluLookAt有9個參數,好像代表3個座標點
//其實是兩個座標點和一個向量
//第一個座標是攝影機的位置座標
//第二個座標是攝影機所要拍攝的物體位置座標,只是要確定拍攝方向
//第三個座標是攝影機正上方的向量,不懂要這幹什麼嗎?
//
//OpenGL只知道攝影機的位置、攝影機的拍攝方向還不夠啊
//誰知道你要躺著拍還是倒立著拍
--------------------------------------------------------------------------------
//------glBegin(GL_TRIANGLES); & glEnd();
//
//告訴OpenGL要動筆畫圖了,使用了glBegin之後開始繪圖指令
//畫完之後要打上glEnd();結束繪圖
//開啟了什麼就要關掉什麼,這點在DirectX還有很多API上面也是一樣的
//
//GL_TRIANGLES選擇你要畫的是三角形
//除了三角形還有GL_POINTS、GL_LINES和GL_QUADS(四邊形)以及更特別的可以選(但不重要)
--------------------------------------------------------------------------------
//------glColor3f( 紅 , 綠 , 藍 ); & glVertex3f( x , y , z );
//
//glColor3f的3個顏色值都介於0到1之間
//glVertex3f設定座標點,它的顏色取決於它前面的glColor3f
//由於前面的glBegin選擇要畫三角形
//所以在glBegin()和glEnd之間給出3個座標點可以定義一個三角形
//給出6個座標點可以定義兩個三角形
//給4個或5個會怎樣我不知道,你可以try看看
--------------------------------------------------------------------------------
//------glutSwapBuffers();
//
//當你使用雙緩衝區時,可以說是提供了兩張畫布供OpenGL作畫
//已經畫好的那一張先貼上視窗,另外一張正在OpenGL的手上趕工
//
//如果用單緩衝區的話,就要等OpenGL趕稿了
//稿子完成了貼上視窗,趕稿期間畫面被glClear清乾淨了,只剩背景色
//完稿了又貼上畫面,趕著畫下一張,畫面又被glClear清乾淨了
//如此循環下去,即使電腦的手腳很快,畫面還是難免有閃爍感(不舒服)
//
//所以全世界的遊戲都會採用雙緩衝區這個方法
//
//glutSwapBuffers()所做的就是在OpenGL繪畫完成之後趕緊變更顯示的緩衝區
//將新的畫作呈現在螢幕上,然後OpenGL在另一個緩衝區繼續趕稿
//畫好了之後glutSwapBuffers()又變更顯示的緩衝區
//將最新的畫作呈現在螢幕上,舊畫面被glClear清理了,以供OpenGL再次趕稿
//視窗上永遠有一張圖來撐場面,於是就沒有閃爍感了
程式設計還是自己玩玩看、到處試一試
能得到較完整的知識、彌補書上的不足
我的教學就更空洞了,看書最實在 |
|
回頂端 |
|
|
SQNG 稍嫌羞澀的路人
註冊時間: 2011-07-02 文章: 1
5.94 果凍幣
|
發表於: 2011-7-2, PM 11:52 星期六 文章主題: |
|
|
很感謝作者用心的PO教學,這是我看過很仔細的教學文之一,受益良多 |
|
回頂端 |
|
|
還是零分 散播福音的祭司
註冊時間: 2007-09-19 文章: 164
653.83 果凍幣
|
發表於: 2011-7-9, AM 11:11 星期六 文章主題: |
|
|
很高興有人受益 |
|
回頂端 |
|
|
oscar60514 稍嫌羞澀的路人
註冊時間: 2011-07-11 文章: 1
6.03 果凍幣
|
發表於: 2011-7-11, PM 1:16 星期一 文章主題: |
|
|
最近有空可以來研究openGL
沒想到有人這麼熱心地分享教學
小弟虛心受教^^ |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 可以 在這個版面附加檔案 您 可以 在這個版面下載檔案
|
|