OpenGL编程指南3:GLUT:OpenGL使用工具库
生活随笔
收集整理的這篇文章主要介紹了
OpenGL编程指南3:GLUT:OpenGL使用工具库
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.前言
我們知道的,OpenGL包含了很多的渲染函數(shù),這些函數(shù)的設(shè)計(jì)目的就是獨(dú)立與任何窗口系統(tǒng)或操作系統(tǒng)。因此,他并沒(méi)有包含打開(kāi)窗口或者從鍵盤或鼠標(biāo)讀取事件的函數(shù)。遺憾的是,如果連最基本的打開(kāi)窗口的功能都沒(méi)有,那么編寫一個(gè)完成的圖形程序簡(jiǎn)直就是天方夜譚! GLUT庫(kù)正可以彌補(bǔ)這個(gè)缺陷。該庫(kù)可以簡(jiǎn)化打開(kāi)窗口、檢測(cè)輸入等任務(wù)。 此外,由于OpenGL函數(shù)僅限于生成簡(jiǎn)單的幾何圖元(點(diǎn)、直線、多邊形),GLUT包含了一些更為復(fù)雜的三維物體,例如球體、圓環(huán)面和茶壺(當(dāng)然,OpenGL實(shí)用庫(kù)也包含了一些復(fù)雜三維圖形繪制函數(shù))。 正如編程指南作者說(shuō)的那樣,如果想學(xué)習(xí)編寫完整的OpenGL應(yīng)用程序,glut無(wú)法滿足要求,但是glut可以作為學(xué)習(xí)OpenGL的一個(gè)非常好的起點(diǎn)。2.GLUT庫(kù)功能
2.1 窗口管理
GLUT通過(guò)幾個(gè)函數(shù)執(zhí)行初始化窗口所需要的任務(wù)。- glutInit(int *arg,char ** argv);對(duì)glut進(jìn)行初始化,并處理所有的命令行參數(shù)。glutInit()應(yīng)該在調(diào)用其他任何GLUT函數(shù)之前調(diào)用。
- glutInitDisplayMode(unsigned int mode);指定了是使用RGBA模式還是顏色索引模式。另外還可以指定是使用單緩沖還是使用雙緩沖窗口。如果想使用顏色索引模式,就需要把一些顏色加載到顏色映射表中,這個(gè)任務(wù)可以用glutSetColor()完成。最后,還可以使用這個(gè)函數(shù)表示窗口擁有相關(guān)連得深度、模板、多重采樣和或累積緩沖區(qū)。例如,需要一個(gè)雙緩沖,RGBA顏色模式以及帶有一個(gè)深度緩沖區(qū)的窗口,可以調(diào)用glutDisplayMode(GLUT_GOUBLE|GLUT_RGBA|GLUT_DEPTH)。
- glutInitWindowPosition(int x,int y);指定窗口左上角的屏幕位置。
- glutInitWindowSize(int width,int size);指定了窗口的大小,以像素為單位。
- glutInitContextVersion(int majorVersion,int minorVersion);聲明了要使用OpenGL的哪個(gè)版本。
- glutInitContextFlags(int flags);聲明了想要使用的OpenGL渲染環(huán)境的類型。對(duì)于常規(guī)的OpenGL操作,可以在自己的程序中省略這一調(diào)用,然而,如果想要使用向前兼容的OpenGL渲染環(huán)境,需要調(diào)用這一函數(shù)。
- int glutCreateWindow(char *string)創(chuàng)建了一個(gè)支持OpenGL渲染環(huán)境的窗口。這個(gè)函數(shù)返回一個(gè)唯一的標(biāo)志符,標(biāo)示了這個(gè)窗口。注意,在調(diào)用glutMainloop()函數(shù)之前,這個(gè)窗口并沒(méi)有顯示。
2.2 顯示回調(diào)函數(shù)
glutDisplayFunc(void(*func)(void));是我們看到的第一個(gè)也是最為重要的時(shí)間回調(diào)函數(shù)。每當(dāng)GLUT確定一個(gè)窗口的內(nèi)容需要重新顯示時(shí),通過(guò)glutDisplayFunc()注冊(cè)的那個(gè)回調(diào)函數(shù)就會(huì)被執(zhí)行。因此,應(yīng)該把重繪場(chǎng)景所需要的所有代碼都放在這個(gè)顯示回調(diào)函數(shù)里。 如果程序修改了窗口的內(nèi)容,有時(shí)候可能需要調(diào)用glutPostRedisplay(),這個(gè)函數(shù)將會(huì)指示glutMainLoop()調(diào)用已注冊(cè)的顯示回調(diào)函數(shù)。2.3 運(yùn)行程序
最后,必須調(diào)用glutMainLoop()開(kāi)啟動(dòng)程序。所有已經(jīng)創(chuàng)建的窗口將會(huì)在這里顯示,對(duì)這些窗口的渲染也開(kāi)始生效,事件處理循環(huán)開(kāi)始啟動(dòng),已注冊(cè)的顯示毀掉桉樹(shù)被觸發(fā)。一旦進(jìn)入循環(huán),他就永遠(yuǎn)不會(huì)退出。 #include "vgl.h"void init(void) {//select clearing (background) colorglClearColor(0.0,0.0,0.0,0.0);//initialize viewing valueglMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0); } void display(void) {//clear all pixelsglClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glBegin(GL_POLYGON);glVertex3f(0.25,0.25,0.0);glVertex3f(0.75,0.25,0.0);glVertex3f(0.75,0.75,0.0);glVertex3f(0.25,0.75,0.0);glEnd();glFlush(); } int main(int argc, char **argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(250,250);glutCreateWindow("Hello");init();glutDisplayFunc(display);glutMainLoop();//return 0; }2.4 處理輸入事件
可以使用下面一些函數(shù)注冊(cè)一些回調(diào)函數(shù),當(dāng)指定的時(shí)間發(fā)生時(shí),這些函數(shù)便會(huì)被調(diào)用:- glutReshapeFunc(void(*fun)(int w,int h));表示當(dāng)窗口的大小發(fā)生改變時(shí)應(yīng)該采取什么行動(dòng)。
- glutKeyboardFunc(void(*Func)(unsigned char key,int x,int y));和glutMouseFunc(void(*func)(int button, int state,int x,int y));允許把鍵盤上的一個(gè)鍵或鼠標(biāo)上的一個(gè)按鈕與一個(gè)函數(shù)相關(guān)聯(lián),當(dāng)這個(gè)鍵或按鈕被按下或釋放時(shí),這個(gè)函數(shù)就會(huì)調(diào)用。
- glutMotionFunc(void(*Func)(int x,int y));注冊(cè)了一個(gè)函數(shù),當(dāng)按下一個(gè)鼠標(biāo)按鈕移動(dòng)鼠標(biāo)時(shí),這個(gè)函數(shù)就會(huì)被調(diào)用。
2.5 空閑處理
可以在glutIdleFunc(void(*Func)(void))回調(diào)函數(shù)中制定一個(gè)回調(diào)函數(shù),如果不存在其他尚未完成的事件(例如,當(dāng)事件循環(huán)處于空閑的時(shí)候),就執(zhí)行這個(gè)函數(shù)。這個(gè)回調(diào)函數(shù)接受一個(gè)函數(shù)指針作為他的唯一參數(shù)。如果向他傳遞NULL(0),那就相當(dāng)于禁用這個(gè)函數(shù)。2.6 繪制三維體
GLUT包含了幾個(gè)函數(shù),用于繪制下面這些三維物體(圓錐體,二十面體,茶壺,立方體,八面體,四面體十二面體,球體,圓環(huán)面); 可以根據(jù)已定義的法線把這些物體畫成線框模型或?qū)嵭哪P汀@?#xff0c;用于繪制立方體的和球體的函數(shù): void glutWireCube(GLdouble size); void glutSolidCube(GLdouble size); void glutWireSphere(GLdouble size); void glutSolidSphere(GLdouble size); 在繪制這些模型時(shí),他們的中心位置都處于全局坐標(biāo)系統(tǒng)的原點(diǎn)。3.參看資料
[1]施萊爾, GrahamSellers, JohnKessenich,等. OpenGL編程指南[M]. 機(jī)械工業(yè)出版社, 2014.總結(jié)
以上是生活随笔為你收集整理的OpenGL编程指南3:GLUT:OpenGL使用工具库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电力信息化的培训
- 下一篇: OpenGL编程指南4:双缓冲实现运行