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

Google
[轉貼自程式設計俱樂部]glut 教學 - 邁向三維世界, 去吧!! 不要回頭

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
satanupup
喜歡上這裡的冒險者


註冊時間: 2007-05-29
文章: 80

68.10 果凍幣

發表發表於: 2007-6-28, PM 2:07 星期四    文章主題: [轉貼自程式設計俱樂部]glut 教學 - 邁向三維世界, 去吧!! 不要回頭 引言回覆

作者 : ma_hty(白老鼠(Gary))
現代的顯示卡, 最重要的一個功能, 就是立體模型繪畫的硬體加速, 使用硬體加速, 編程的考慮 跟單以 CPU 作運算的考慮是完全不同的.

說這個之先, 要先說說顯示卡發展.

從前所謂立體模型繪圖都是以 CPU 做的, 顯示卡只是負責把資料放到顯示器而已. 那時候, 都是 MFC系列繪圖 為主導的, 大概的理念就是 需要更新的像素愈少 程式愈快, MFC系列繪圖, 為了要迎合這個, 攪出了很多很複雜的概念, 在那時候, 大家也安心的給它戲弄. 直到 Voodoo 的出現, 繪圖理念被翻天覆地的改變了.

大約在 1998 年 ( 實際的時間我沒認真的考究 ), 出現了 Voodoo 硬體加速卡, 所提供的功能, 就是以硬體同步處理 大量的三角形 和 大量的像素, 因為可以同步處理, 所以速度比起單向的 CPU 運算速度高出很多 (當然, 可以這樣做, 是因為 立體模型運算 和 繪畫運算 都是大量而同一的運算 ). 也許, 你會對 Voodoo 這個品牌很陌生, 因為, Voodoo 出現了沒多久, 就被收購了, 而且, 由那時開始, 硬體加速就成了顯示卡的必然配備.

因為有了 硬體同步處理 的功能, 所以, 我們不用再 盡量減少需要處理的 像素 和 頂點, 因為它們都是同步完成的, 多少 像素 和 頂點 需要更新也好, 都是 one pass 完成. 如此, 主要影響程式速度的因素, 變成了資料由 主記憶體 傳送到 顯示卡的部份 ( MFC系列繪圖就是這樣被淘汰了, 多好啊... ).

現在, 我們要推速度, 需要做的是盡量減少資料互傳, 因此, 顯示卡的記憶體愈大, 資料互傳 的需要就愈少, 程式就會愈快. 舉例說, 繪圖一張平面的圖, 如果我們把圖檔資料放在主記憶體, 然後都次都由主記憶體去繪畫, 你是完全用不到顯示卡的硬體好處的, 要用到硬體加速的好處, 你需要把圖檔以 texture 的形式放到 顯示卡, 然後, 再控制顯示卡繪畫, 這麼, 差不多所有的運算都是由顯示卡完成了, CPU 只需要做管理工作. 這是很重要的, 因為, 當你可以空閒出更多 CPU 時間, 就意味著你的程式的反應會更靈敏 (當然, 要得到這種好處, 你需要正確的控制你的顯示卡 )... ...

好, 故事說得差不多了.

現在, 我們開始學習如何去控制你的顯示卡去工作.
----------------------------
/////////////////////////
// glutTest06.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//


#include <stdio.h>

#include "glut.h"

void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 20, 1, 0, 10 );

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
0,0,1,
0,0,0,
0,1,0 );

glEnable( GL_DEPTH_TEST );
glutWireTeapot( .1 );

glutSwapBuffers();
}

void main()
{
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB );
glutInitWindowSize( 640, 640 );
glutCreateWindow( "hihi" );

glutDisplayFunc(display);

glutMainLoop();
}
------------------------------------
上面短短的原碼, 是用來繪畫一個 茶壺 的.

首先我們要一點立體模型繪畫的概念.

立體模型都是以三角形來定義的, 這是因為顯示卡的硬體所提供的功能只對應 三角形, 而每頂點就是四個值的向量, 然後, 模型的 平移, 旋轉 和 扭曲, 都可以由一個 4x4 的矩陣去代表, 而且, 連續的動作, 只要把接著的 模型矩陣 乘上 現在的 模型矩陣 就可以了.

立體視覺的效果, 也可以由一個 4x4 的矩陣去代表, 背後的意思, 實際是把立體模型 scale 進一個六面體, 然後再投射到 Z plane, 這個 六面體 就是我們所說的 view frustum, 只是正確的控制這個六面體, 我們就可以做出遠近配置的透視效果.

在 OpenGL 裡, 視點 和 模型的變動, 是由 GL_MODELVIEW 這個矩陣控制的, 而 立體視覺的效果 就是由 GL_PROJECTION 這個矩陣控制的.

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 20, 1, 0, 10 );

這三句的意是, 就是把立體視覺的效果設成 視角 20度, 橫直比例 1, near clip plane 距離視點 0 個單位, far clip plane 距離視點 10 個單位. 如果你對攝影有點認識, 這些你大概不會陌生了.

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
0,0,1,
0,0,0,
0,1,0 );

這三句的意是, 就是把控制 modelview matrix, 把視點設在 (0,0,1) 位置, 望向 (0,0,0), 向上方向 (0,1,0).
-----------------------
在顯示卡內, 有好些基制去減少不必要的 頂點 和 像素 運算的.

舉例說, 當模型被 scale 進 view frustum 之後, 在 far clip plane 之後的頂點, 和 在 near clip plane 之前的頂點, 也會被捨棄.

而其中一個必須的, 是 DEPTH_TEST, 即深度測試, 當模型被 scale 進 view frustum 之後, 每三角型就會被換算作畫面上的相應像素, 同時, 我們會得到每像素的 Z 座標, 即是相對於距離視點的單位, 當兩個三角形有重疊時, 我們就依靠它的深度去判斷那一個像素需要被顯示. 如果沒有開啟 DEPTH_TEST, 所有在後畫的三角形都會蓋在面, 這麼, 你的立體模型就會亂七八糟了.

而使用 DEPTH_TEST,

你需要先設定 display mode 去使用 depth buffer,
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB );

每次重畫時, 也要把 depth buffer 清空,
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

還要記緊指示 OpenGL 去使用 DEPTH_TEST ( 因為預設是不使用的)
glEnable( GL_DEPTH_TEST );
----------------------
最後順帶一提, glut 提供了一些內建的立體模型的, 上面所畫的茶壺, 就是 glut 所提供的.

除了 茶壺之外, 還有 二十面體, 四面體, 八面體, 十二面體, Torus, 立方體, 圓錐體 和 球體.

用來做測試, 使用這些內建的立體模型會很方便的.
-----------------------
如果你是初學者, 真的是, 好, 好, 好, 這麼冗長的介紹你也可以看得完啊, 不要浪費呀, 試試改改上面的範例, 不要畫茶壺, 改為畫 glut 其他內建的立體模型呀.
---------------------
噢, 上面的寫錯了一點點, near clip plane 離開視點的距離不可以是 零. 應該是一個很小的值, 即

gluPerspective( 20, 1, 0.1, 10 );

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

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


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