【OpenGL开发】glut和freeglut下载及配置
目錄
目錄
1、glut下載
2、freeglut下載
3、代碼示例
3.1 打印顯卡驅動信息
3.2 繪制一個三角形
3.3 使用VBO繪制一個三角形
3.4 使用VAO,VBO繪制一個矩形
4、調試OpenGL
后續
1、glut下載
OpenGL工具庫 OpenGL Utility Toolkit,包含大約30多個函數,函數名前綴為glut。
glut是不依賴于窗口平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(現在在Nvidia),目的是隱藏不同窗口平臺API的復雜度。 函數以glut開頭,它們作為aux庫功能更強的替代品,提供更為復雜的繪制功能,此函數由glut.dll來負責解釋執行。由于glut中的窗口管理函數是不依賴于運行環境的,因此OpenGL中的工具庫可以在X-Window, Windows NT, OS/2等系統下運行,特別適合于開發不需要復雜界面的OpenGL示例程序。對于有經驗的程序員來說,一般先用glut理順3D圖形代碼,然后再集成為完整的應用程序。
這部分函數主要包括
- 窗口操作函數:窗口初始化、窗口大小、窗口位置等函數glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等
- 回調函數:響應刷新消息、鍵盤消息、鼠標消息、定時器函數等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()
- 創建復雜的三維物體:這些和aux庫的函數功能相同。創建網狀體和實心體。如glutSolidSphere()、glutWireSphere()等
- 菜單函數:創建添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()
- 程序運行函數:glutMainLoop()
GLUT(OpenGL Utility Toolkit)是一個跨平臺工具庫,只能在win32下使用,不提供64位的開發環境,而且在1998年之后一直沒有更新了。
目前最后版本GLUT v3.7的歷史可追溯至1998年8月,且該項目似乎已經被廢棄。它的許可證禁止任何人發布修改后的庫代碼。
?glut32.dll和glut.dll有什么區別?glut32.dll是為微軟封裝的,官方的。而glut.dll是sgi封裝的。?
?官網地址:
GLUT - The OpenGL Utility Toolkit
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
2、freeglut下載
freeglut is an open-source?alternative to the OpenGL Utility Toolkit (GLUT) library.?
freeglut最初由帕維爾·W. Olszta與安德烈亞斯·烏姆巴赫和史蒂夫·貝克的貢獻。史蒂夫是現在官方的擁有者/維護者。帕維爾在1999年12月1日開始freeglut的開發。目前,該項目幾乎可以100%的替代原來的GLUT,只有少數差別(如the abandonment of SGI-specific features,按鈕盒子和動態視頻分辨率)和 其他一小部分程序Bug。?
這個庫是原始的GLUT庫修改之后得到的,它既提供32位、也提供64位的編譯環境。?
官網地址:
http://freeglut.sourceforge.net/
freeglut download | SourceForge.net
Martin Payne's Windows binaries (MSVC and MinGW):http://www.transmissionzero.co.uk/software/freeglut-devel/
DLL放置目錄:
32位的DLL?X:\Windows\System32
64位的DLL?X:\Windows\SysWOW64
3、代碼示例
3.1 打印顯卡驅動信息
#include <windows.h> #include <stdio.h> #include <GL/freeglut.h>int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(300, 300);glutInitWindowPosition(100, 100);glutCreateWindow("OpenGL Version");const GLubyte* szVendor = glGetString(GL_VENDOR);const GLubyte* szRender = glGetString(GL_RENDERER);const GLubyte* szGLVersion = glGetString(GL_VERSION);const GLubyte* szGluVersion = gluGetString(GLU_VERSION);printf("OpenGL實現廠商的名字:%s\n", szVendor);printf("渲染器標識符:%s\n", szRender);printf("OpenGL實現的版本號:%s\n", szGLVersion);printf("GLU工具庫版本:%s\n", szGluVersion);system("pause");return 0; }3.2 繪制一個三角形
#include <GL/freeglut.h>void renderScene(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glBegin(GL_TRIANGLES);glVertex3f(-0.5, -0.5, 0.0);glVertex3f(0.5, 0.0, 0.0);glVertex3f(0.0, 0.5, 0.0);glEnd();glutSwapBuffers(); }int main(int argc, char** argv) {glutInit(&argc, (char**)argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100, 100);glutInitWindowSize(800, 480);glutCreateWindow("第一個glut程序");glutDisplayFunc(renderScene);glutMainLoop(); return 0; }3.3 使用VBO繪制一個三角形
?頂點緩沖對象(Vertex Buffer Objects,VBO)
#include <stdio.h> #include <GL/glew.h> #include <GL/freeglut.h>GLuint VBO;static void RenderSceneCB() {glClear(GL_COLOR_BUFFER_BIT);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, VBO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glDrawArrays(GL_TRIANGLES, 0, 3);glDisableVertexAttribArray(0);glutSwapBuffers(); }static void InitializeGlutCallbacks() {glutDisplayFunc(RenderSceneCB); }static void CreateVertexBuffer() {Vector3f Vertices[3];Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); }int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);glutInitWindowSize(1024, 768);glutInitWindowPosition(100, 100);glutCreateWindow("glut + VBO + triangle ");InitializeGlutCallbacks();// Must be done after glut is initialized!GLenum res = glewInit();if (res != GLEW_OK) {fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));return 1;}glClearColor(0.0f, 0.0f, 0.0f, 0.0f);CreateVertexBuffer();glutMainLoop();return 0; }3.4 使用VAO,VBO繪制一個矩形
- 頂點緩沖對象(Vertex Buffer Objects,VBO)
- 頂點數組對象(Vertex Arrary Object,VAO)
- 索引緩沖對象(Element Buffer Object,EBO)
4、調試OpenGL
#include <iostream> #include <GL/glew.h> #include <GL/freeglut.h>void display() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glDrawArrays(666, 666, 666);glutSwapBuffers(); }void keyboard(unsigned char key, int, int) {if (key == 27) exit(EXIT_SUCCESS); }void GLAPIENTRY debug(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) {std::cout << std::hex<< "source:0x" << source << std::endl<< "type:0x" << type << std::endl<< "id:0x" << id << std::endl<< "severity:0x" << severity << std::endl<< "length:" << length << std::endl<< "message:" << message << std::endl<< "userParam:" << userParam << std::endl<< std::dec; }int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitContextFlags(GLUT_FORWARD_COMPATIBLE | GLUT_DEBUG);glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);glutInitContextVersion(3, 3);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);glutCreateWindow("");glutDisplayFunc(display);glutKeyboardFunc(keyboard);glewInit();glDebugMessageCallback(debug, nullptr);glutMainLoop();return 0; }后續
?如果你覺得該方法或代碼有一點點用處,可以給作者點個贊;╮( ̄▽ ̄)╭
如果你感覺方法或代碼不咋地//(ㄒoㄒ)//,就在評論處留言,作者繼續改進。o_O???
謝謝各位童鞋們啦( ′ ▽ ` )ノ ( ′ ▽ ` )っ!!!
總結
以上是生活随笔為你收集整理的【OpenGL开发】glut和freeglut下载及配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#Socket编程TCP实例(四)
- 下一篇: weblogic启动项目失败查看_web