OpenGL入门教程资料Word文档下载推荐.docx
- 文档编号:20034604
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:84
- 大小:275.41KB
OpenGL入门教程资料Word文档下载推荐.docx
《OpenGL入门教程资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OpenGL入门教程资料Word文档下载推荐.docx(84页珍藏版)》请在冰豆网上搜索。
Windows環境下的GLUT下載地址:
(大小約為150k)
//www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
無法從以上位址下載的話請使用下面的連接:
Windows環境下安裝GLUT的步驟:
1、將下載的壓縮包解開,將得到5個檔
2、在“我的電腦”中搜索“gl.h”,並找到其所在資料夾(如果是VisualStudio2005,則應該是其安裝目錄下麵的“VC\PlatformSDK\include\gl資料夾”)。
把解壓得到的glut.h放到這個資料夾。
3、把解壓得到的glut.lib和glut32.lib放到靜態函式程式庫所在資料夾(如果是VisualStudio2005,則應該是其安裝目錄下麵的“VC\lib”資料夾)。
4、把解壓得到的glut.dll和glut32.dll放到作業系統目錄下麵的system32資料夾內。
(典型的位置為:
C:
\Windows\System32)
第三步,建立一個OpenGL工程
這裡以VisualStudio2005為例。
選擇File->
New->
Project,然後選擇Win32
Console
Application,選擇一個名字,然後按OK。
在談出的對話方塊左邊點Application
Settings,找到Empty
project並勾上,選擇Finish。
然後向該工程添加一個代碼檔,取名為“OpenGL.c”,注意用.c來作為檔結尾。
搞定了,就跟平時的工程沒什麼兩樣的。
第一個OpenGL程式
一個簡單的OpenGL程式如下:
(注意,如果需要編譯並運行,需要正確安裝GLUT,安裝方法如上所述)
#include
GL/glut.h>
void
myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f,
-0.5f,
0.5f,
0.5f);
glFlush();
}
int
main(int
argc,
char
*argv[])
glutInit(&
argv);
glutInitDisplayMode(GLUT_RGB
|
GLUT_SINGLE);
glutInitWindowPosition(100,
100);
glutInitWindowSize(400,
400);
glutCreateWindow("
第一個OpenGL程式"
);
glutDisplayFunc(&
myDisplay);
glutMainLoop();
return
0;
該程式的作用是在一個黑色的視窗中央畫一個白色的矩形。
下面對各行語句進行說明。
怎麼樣?
代碼還不算長吧?
首先,需要包含標頭檔#include
,這是GLUT的標頭檔。
本來OpenGL程式一般還要包含<
GL/gl.h>
和<
GL/glu.h>
,但GLUT的標頭檔中已經自動將這兩個檔包含了,不必再次包含。
然後看main函數。
*argv[]),這個是帶命令列參數的main函數,各位應該見過吧?
沒見過的同志們請多翻翻書,等弄明白了再往下看。
注意main函數中的各語句,除了最後的return之外,其餘全部以glut開頭。
這種以glut開頭的函數都是GLUT工具包所提供的函數,下面對用到的幾個函數進行介紹。
1、glutInit,對GLUT進行初始化,這個函數必須在其它的GLUT使用之前調用一次。
其格式比較死板,一般照抄這句glutInit(&
argv)就可以了。
2、glutInitDisplayMode,設置顯示方式,其中GLUT_RGB表示使用RGB顏色,與之對應的還有GLUT_INDEX(表示使用索引顏色)。
GLUT_SINGLE表示使用單緩衝,與之對應的還有GLUT_DOUBLE(使用雙緩衝)。
更多資訊,請自己Google。
當然以後的教程也會有一些講解。
3、glutInitWindowPosition,這個簡單,設置視窗在螢幕中的位置。
4、glutInitWindowSize,這個也簡單,設置視窗的大小。
5、glutCreateWindow,根據前面設置的資訊創建視窗。
參數將被作為視窗的標題。
注意:
視窗被創建後,並不立即顯示到螢幕上。
需要調用glutMainLoop才能看到視窗。
6、glutDisplayFunc,設置一個函數,當需要進行畫圖時,這個函數就會被調用。
(這個說法不夠準確,但準確的說法可能初學者不太好理解,暫時這樣說吧)。
7、glutMainLoop,進行一個消息迴圈。
(這個可能初學者也不太明白,現在只需要知道這個函數可以顯示視窗,並且等待視窗關閉後才會返回,這就足夠了。
)
在glutDisplayFunc函數中,我們設置了“當需要畫圖時,請調用myDisplay函數”。
於是myDisplay函數就用來畫圖。
觀察myDisplay中的三個函式呼叫,發現它們都以gl開頭。
這種以gl開頭的函數都是OpenGL的標準函數,下面對用到的函數進行介紹。
1、glClear,清除。
GL_COLOR_BUFFER_BIT表示清除顏色,glClear函數還可以清除其它的東西,但這裡不作介紹。
2、glRectf,畫一個矩形。
四個參數分別表示了位於對角線上的兩個點的橫、縱坐標。
3、glFlush,保證前面的OpenGL命令立即執行(而不是讓它們在緩衝區中等待)。
其作用跟fflush(stdout)類似。
2.第二課:
本次課程所要講的是繪製簡單的幾何圖形,在實際繪製之前,讓我們先熟悉一些概念。
一、點、直線和多邊形
我們知道數學(具體的說,是幾何學)中有點、直線和多邊形的概念,但這些概念在電腦中會有所不同。
數學上的點,只有位置,沒有大小。
但在電腦中,無論計算精度如何提高,始終不能表示一個無窮小的點。
另一方面,無論圖形輸出設備(例如,顯示器)如何精確,始終不能輸出一個無窮小的點。
一般情況下,OpenGL中的點將被畫成單個的圖元(圖元的概念,請自己搜索之~),雖然它可能足夠小,但並不會是無窮小。
同一圖元上,OpenGL可以繪製許多座標只有稍微不同的點,但該圖元的具體顏色將取決於OpenGL的實現。
當然,過度的注意細節就是鑽牛角尖,我們大可不必花費過多的精力去研究“多個點如何畫到同一圖元上”。
同樣的,數學上的直線沒有寬度,但OpenGL的直線則是有寬度的。
同時,OpenGL的直線必須是有限長度,而不是像數學概念那樣是無限的。
可以認為,OpenGL的“直線”概念與數學上的“線段”接近,它可以由兩個端點來確定。
多邊形是由多條線段首尾相連而形成的閉合區域。
OpenGL規定,一個多邊形必須是一個“凸多邊形”(其定義為:
多邊形內任意兩點所確定的線段都在多邊形內,由此也可以推導出,凸多邊形不能是空心的)。
多邊形可以由其邊的端點(這裡可稱為頂點)來確定。
(注意:
如果使用的多邊形不是凸多邊形,則最後輸出的效果是未定義的——OpenGL為了效率,放寬了檢查,這可能導致顯示錯誤。
要避免這個錯誤,儘量使用三角形,因為三角形都是凸多邊形)
可以想像,通過點、直線和多邊形,就可以組合成各種幾何圖形。
甚至於,你可以把一段弧看成是很多短的直線段相連,這些直線段足夠短,以至於其長度小於一個圖元的寬度。
這樣一來弧和圓也可以表示出來了。
通過位於不同平面的相連的小多邊形,我們還可以組成一個“曲面”。
二、在OpenGL中指定頂點
由以上的討論可以知道,“點”是一切的基礎。
如何指定一個點呢?
OpenGL提供了一系列函數。
它們都以glVertex開頭,後面跟一個數字和1~2個字母。
例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
等等。
數字表示參數的個數,2表示有兩個參數,3表示三個,4表示四個(我知道有點囉嗦~)。
字母表示參數的類型,s表示16位元整數(OpenGL中將這個類型定義為GLshort),
i表示32位元整數(OpenGL中將這個類型定義為GLint和GLsizei),
f表示32位浮點數(OpenGL中將這個類型定義為GLfloat和GLclampf),
d表示64位浮點數(OpenGL中將這個類型定義為GLdouble和GLclampd)。
v表示傳遞的幾個參數將使用指標的方式,見下面的例子。
這些函數除了參數的類型和個數不同以外,功能是相同的。
例如,以下五個程式碼片段的功能是等效的:
(一)glVertex2i(1,
3);
(二)glVertex2f(1.0f,
3.0f);
(三)glVertex3f(1.0f,
3.0f,
0.0f);
(四)glVertex4f(1.0f,
0.0f,
1.0f);
(五)GLfloat
VertexArr3[]
=
{1.0f,
0.0f};
glVertex3fv(VertexArr3);
以後我們將用glVertex*來表示這一系列函數。
OpenGL的很多函數都是採用這樣的形式,一個相同的首碼再加上參數說明標記,這一點會隨著學習的深入而有更多的體會。
三、開始繪製
假設現在我已經指定了若干頂點,那麼OpenGL是如何知道我想拿這些頂點來幹什麼呢?
是一個一個的畫出來,還是連成線?
或者構成一個多邊形?
或者做其它什麼事情?
為了解決這一問題,OpenGL要求:
指定頂點的命令必須包含在glBegin函數之後,glEnd函數之前(否則指定的頂點將被忽略)。
並由glBegin來指明如何使用這些點。
例如我寫:
glBegin(GL_POINTS);
glVertex2f(0.0f,
glVertex2f(0.5f,
glEnd();
則這兩個點將分別被畫出來。
如果將GL_POINTS替換成GL_LINES,則兩個點將被認為是直線的兩個端點,OpenGL將會畫出一條直線。
我們還可以指定更多的頂點,然後畫出更複雜的圖形。
另一方面,glBegin支援的方式除了GL_POINTS和GL_LINES,還有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每種方式的大致效果見下圖:
聲明:
該圖片來自www.opengl.org,該圖片是《OpenGL程式設計指南》一書的附圖,由於該書的舊版(第一版,1994年)已經流傳於網路,我希望沒有觸及到版權問題。
我並不準備在glBegin的各種方式上大作文章。
大家可以自己嘗試改變glBegin的方式和頂點的位置,生成一些有趣的圖案。
程式碼:
glBegin(
/*
在這裡填上你所希望的模式
*/
在這裡使用glVertex*系列函數
*/
指定你所希望的頂點位置
把這段代碼改成你喜歡的樣子,然後用它替換第一課中的myDisplay函數,編譯後即可運行。
兩個例子
例一、畫一個圓
/*
正四邊形,正五邊形,正六邊形,……,直到正n邊形,當n越大時,這個圖形就越接近圓
當n大到一定程度後,人眼將無法把它跟真正的圓相區別
這時我們已經成功的畫出了一個“圓”
(注:
畫圓的方法很多,這裡使用的是比較簡單,但效率較低的一種)
試修改下面的const
n的值,觀察當n=3,4,5,8,10,15,20,30,50等不同數值時輸出的變化情況
將GL_POLYGON改為GL_LINE_LOOP、GL_POINTS等其它方式,觀察輸出的變化情況
math.h>
const
n
20;
GLfloat
R
0.5f;
Pi
3.1415926536f;
i;
glBegin(GL_POLYGON);
for(i=0;
i<
n;
++i)
glVertex2f(R*cos(2*Pi/n*i),
R*sin(2*Pi/n*i));
例二、畫一個五角星
設五角星的五個頂點分佈位置關係如下:
A
E
B
D
C
首先,根據余弦定理列方程,計算五角星的中心到頂點的距離a
(假設五角星對應正五邊形的邊長為.0)
a
1
/
(2-2*cos(72*Pi/180));
然後,根據正弦和余弦的定義,計算B的x座標bx和y座標by,以及C的y座標
(假設五角星的中心在座標原點)
bx
*
cos(18
Pi/180);
by
sin(18
cy
-a
五個點的座標就可以通過以上四個量和一些常數簡單的表示出來
GLfloat
PointA[2]
{
0,
},
PointB[2]
bx,
PointC[2]
0.5,
PointD[2]
-0.5,
PointE[2]
-bx,
};
//
按照A->
C->
E->
B->
D->
A的順序,可以一筆將五角星畫出
glBegin(GL_LINE_LOOP);
glVertex2fv(PointA);
glVertex2fv(PointC);
glVertex2fv(PointE);
glVertex2fv(PointB);
glVertex2fv(PointD);
例三、畫出正弦函數的圖形
由於OpenGL默認座標值只能從-1到1,(可以修改,但方法留到以後講)
所以我們設置一個因數factor,把所有的座標值等比例縮小,
這樣就可以畫出更多個正弦週期
試修改factor的值,觀察變化情況
factor
0.1f;
x;
glBegin(GL_LINES);
glVertex2f(-1.0f,
glVertex2f(1.0f,
以上兩個點可以畫x軸
-1.0f);
以上兩個點可以畫y軸
glBegin(GL_LINE_STRIP);
for(x=-1.0f/factor;
x<
1.0f/factor;
x+=0.01f)
glVertex2f(x*factor,
sin(x)*factor);
小結
本課講述了點、直線和多邊形的概念,以及如何使用OpenGL來描述點,並使用點來描述幾何圖形。
大家可以發揮自己的想像,畫出各種幾何圖形,當然,也可以用GL_LINE_STRIP把很多位置相近的點連接起來,構成函數圖像。
如果有興趣,也可以去找一些圖像比較美觀的函數,自己動手,用OpenGL把它畫出來。
3.第三課:
1、關於點
點的大小預設為1個圖元,但也可以改變之。
改變的命令為glPointSize,其函數原型如下:
glPointSize(GLfloat
size);
size必須大於0.0f,預設值為1.0f,單位為“圖元”。
對於具體的OpenGL實現,點的大小都有個限度的,如果設置的size超過最大值,則設置可能會有問題。
例子:
glPointSize(5.0f);
2、關於直線
(1)直線可以指定寬度:
glLineWidth(GLfloat
width);
其用法跟glPointSize類似。
(2)畫虛線。
首先,使用glEnable(GL_LINE_STIPPLE);
來啟動虛線模式(使用glDisable(GL_LINE_STIPPLE)可以關閉之)。
然後,使用glLineStipple來設置虛線的樣式。
glLineStipple(GLint
factor,
GLushort
pattern);
pattern是由1和0組成的長度為16的序列,從最低位開始看,如果為1,則直線上接下來應該畫的factor個點將被畫為實的;
如果為0,則直線上接下來應該畫的factor個點將被畫為虛的。
以下是一些例子:
示例代碼:
glEnable(GL_LINE_STIPPLE);
glLineStipple(2,
0x0F0F);
glLineWidth(10.0f);
3、關於多邊形
多邊形的內容較多,我們將講述以下四個方面。
(1)多邊形的兩面以及繪製方式。
雖然我們目前還沒有真正的使用三維座標來畫圖,但是建立一些三維的概念還是必要的。
從三維的角度來看,一個多邊形具有兩個面。
每一個面都可以設置不同的繪製方式:
填充、只繪製邊緣輪廓線、只繪製頂點,其中“填充”是預設的方式。
可以為兩個面分別設置不同的方式。
glPolygonMode(GL_FRONT,
GL_FILL);
設置正面為填充方式
glPolygonMode(GL_BACK,
GL_LINE);
設置反面為邊緣繪製方式
glPolygonMode(GL_FRONT_AND_BACK,
GL_POINT);
設置兩面均為頂點繪製方式
(2)反轉
一般約定為“頂點以逆時針順序出現在螢幕上的面”為“正面”,另一個面即成為“反面”。
生活中常見的物體表面,通常都可以用這樣的“正面”和“反面”,“合理的”被表現出來(請找一個比較透明的礦泉水瓶子,在正對你的一面沿逆時針畫一個圓,並標明畫的方向,然後將背面轉為正面,畫一個類似的圓,體會一下“正面”和“反面”。
你會發現正對你的方向,瓶的外
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 入门教程 资料