電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
OpenGL入門教學(03)

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
還是零分
散播福音的祭司


註冊時間: 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教學,這是我看過很仔細的教學文之一,受益良多 Laughing
回頂端
檢視會員個人資料 發送私人訊息
還是零分
散播福音的祭司


註冊時間: 2007-09-19
文章: 164

653.83 果凍幣

發表發表於: 2011-7-9, AM 11:11 星期六    文章主題: 引言回覆

很高興有人受益 Smile
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
oscar60514
稍嫌羞澀的路人


註冊時間: 2011-07-11
文章: 1

6.03 果凍幣

發表發表於: 2011-7-11, PM 1:16 星期一    文章主題: 引言回覆

最近有空可以來研究openGL

沒想到有人這麼熱心地分享教學

小弟虛心受教^^
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作