日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL编程指南3:GLUT:OpenGL使用工具库

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL编程指南3:GLUT:OpenGL使用工具库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

我們知道的,OpenGL包含了很多的渲染函數,這些函數的設計目的就是獨立與任何窗口系統或操作系統。因此,他并沒有包含打開窗口或者從鍵盤或鼠標讀取事件的函數。遺憾的是,如果連最基本的打開窗口的功能都沒有,那么編寫一個完成的圖形程序簡直就是天方夜譚! GLUT庫正可以彌補這個缺陷。該庫可以簡化打開窗口、檢測輸入等任務。 此外,由于OpenGL函數僅限于生成簡單的幾何圖元(點、直線、多邊形),GLUT包含了一些更為復雜的三維物體,例如球體、圓環面和茶壺(當然,OpenGL實用庫也包含了一些復雜三維圖形繪制函數)。 正如編程指南作者說的那樣,如果想學習編寫完整的OpenGL應用程序,glut無法滿足要求,但是glut可以作為學習OpenGL的一個非常好的起點。

2.GLUT庫功能

2.1 窗口管理

GLUT通過幾個函數執行初始化窗口所需要的任務。
  • glutInit(int *arg,char ** argv);對glut進行初始化,并處理所有的命令行參數。glutInit()應該在調用其他任何GLUT函數之前調用。
  • glutInitDisplayMode(unsigned int mode);指定了是使用RGBA模式還是顏色索引模式。另外還可以指定是使用單緩沖還是使用雙緩沖窗口。如果想使用顏色索引模式,就需要把一些顏色加載到顏色映射表中,這個任務可以用glutSetColor()完成。最后,還可以使用這個函數表示窗口擁有相關連得深度、模板、多重采樣和或累積緩沖區。例如,需要一個雙緩沖,RGBA顏色模式以及帶有一個深度緩沖區的窗口,可以調用glutDisplayMode(GLUT_GOUBLE|GLUT_RGBA|GLUT_DEPTH)。
  • glutInitWindowPosition(int x,int y);指定窗口左上角的屏幕位置。
  • glutInitWindowSize(int width,int size);指定了窗口的大小,以像素為單位。
  • glutInitContextVersion(int majorVersion,int minorVersion);聲明了要使用OpenGL的哪個版本。
  • glutInitContextFlags(int flags);聲明了想要使用的OpenGL渲染環境的類型。對于常規的OpenGL操作,可以在自己的程序中省略這一調用,然而,如果想要使用向前兼容的OpenGL渲染環境,需要調用這一函數。
  • int glutCreateWindow(char *string)創建了一個支持OpenGL渲染環境的窗口。這個函數返回一個唯一的標志符,標示了這個窗口。注意,在調用glutMainloop()函數之前,這個窗口并沒有顯示

2.2 顯示回調函數

glutDisplayFunc(void(*func)(void));是我們看到的第一個也是最為重要的時間回調函數。每當GLUT確定一個窗口的內容需要重新顯示時,通過glutDisplayFunc()注冊的那個回調函數就會被執行。因此,應該把重繪場景所需要的所有代碼都放在這個顯示回調函數里。 如果程序修改了窗口的內容,有時候可能需要調用glutPostRedisplay(),這個函數將會指示glutMainLoop()調用已注冊的顯示回調函數。

2.3 運行程序

最后,必須調用glutMainLoop()開啟動程序。所有已經創建的窗口將會在這里顯示,對這些窗口的渲染也開始生效,事件處理循環開始啟動,已注冊的顯示毀掉桉樹被觸發。一旦進入循環,他就永遠不會退出。 #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 處理輸入事件

可以使用下面一些函數注冊一些回調函數,當指定的時間發生時,這些函數便會被調用:
  • glutReshapeFunc(void(*fun)(int w,int h));表示當窗口的大小發生改變時應該采取什么行動。
  • glutKeyboardFunc(void(*Func)(unsigned char key,int x,int y));和glutMouseFunc(void(*func)(int button, int state,int x,int y));允許把鍵盤上的一個鍵或鼠標上的一個按鈕與一個函數相關聯,當這個鍵或按鈕被按下或釋放時,這個函數就會調用。
  • glutMotionFunc(void(*Func)(int x,int y));注冊了一個函數,當按下一個鼠標按鈕移動鼠標時,這個函數就會被調用。

2.5 空閑處理

可以在glutIdleFunc(void(*Func)(void))回調函數中制定一個回調函數,如果不存在其他尚未完成的事件(例如,當事件循環處于空閑的時候),就執行這個函數。這個回調函數接受一個函數指針作為他的唯一參數。如果向他傳遞NULL(0),那就相當于禁用這個函數。

2.6 繪制三維體

GLUT包含了幾個函數,用于繪制下面這些三維物體(圓錐體,二十面體,茶壺,立方體,八面體,四面體十二面體,球體,圓環面); 可以根據已定義的法線把這些物體畫成線框模型或實心模型。例如,用于繪制立方體的和球體的函數: void glutWireCube(GLdouble size); void glutSolidCube(GLdouble size); void glutWireSphere(GLdouble size); void glutSolidSphere(GLdouble size); 在繪制這些模型時,他們的中心位置都處于全局坐標系統的原點。

3.參看資料

[1]施萊爾, GrahamSellers, JohnKessenich,等. OpenGL編程指南[M]. 機械工業出版社, 2014.

總結

以上是生活随笔為你收集整理的OpenGL编程指南3:GLUT:OpenGL使用工具库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。