討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 網路投保旅行平安險 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
glut 教學 - 邁向三維世界, 去吧!! 不要回頭
更改我的閱讀文章字型大小
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 10:02:01
現代的顯示卡, 最重要的一個功能, 就是立體模型繪畫的硬體加速, 使用硬體加速, 編程的考慮 跟單以 CPU 作運算的考慮是完全不同的.

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

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

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

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

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




作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 10:12:32
好, 故事說得差不多了.

現在, 我們開始學習如何去控制你的顯示卡去工作.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 10:13:12
/////////////////////////
// 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();
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 11:02:13
上面短短的原碼, 是用來繪畫一個 茶壺 的.

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

立體模型都是以三角形來定義的, 這是因為顯示卡的硬體所提供的功能只對應 三角形, 而每頂點就是四個值的向量, 然後, 模型的 平移, 旋轉 和 扭曲, 都可以由一個 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).


作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 11:23:20
在顯示卡內, 有好些基制去減少不必要的 頂點 和 像素 運算的.

舉例說, 當模型被 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 );


作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 11:29:53
最後順帶一提, glut 提供了一些內建的立體模型的, 上面所畫的茶壺, 就是 glut 所提供的.

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

用來做測試, 使用這些內建的立體模型會很方便的.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 上午 11:35:16
如果你是初學者, 真的是, 好, 好, 好, 這麼冗長的介紹你也可以看得完啊, 不要浪費呀, 試試改改上面的範例, 不要畫茶壺, 改為畫 glut 其他內建的立體模型呀.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/21 下午 01:07:50
噢, 上面的寫錯了一點點, near clip plane 離開視點的距離不可以是 零. 應該是一個很小的值, 即

gluPerspective( 20, 1, 0.1, 10 );
作者 : hfuman(王子麵)
[ 貼文 17 | 人氣 2829 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/15 上午 10:24:17
C:\Documents and Settings\openGL\tear.cpp(11) : error C2065: 'gluPerspective' : undeclared identifier
C:\Documents and Settings\openGL\tear.cpp(16) : error C2065: 'gluLookAt' : undeclared identifier

這2個函數我好像沒有~~~
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/15 上午 10:44:11
請先完成第一個教學...
作者 : hfuman(王子麵)
[ 貼文 17 | 人氣 2829 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/26 上午 09:36:54
我就是已經完成了
按照教學步驟~一步步做~
做到這一張教學
結果出現這2個沒有定義~~
 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2720 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625