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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【OpenGL开发】glut和freeglut下载及配置

發布時間:2024/8/1 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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)
//使用VAO VBO繪制矩形 #include <GL/glew.h> #include <GL/freeglut.h> GLuint vboId;//vertex buffer object句柄 GLuint vaoId;//vertext array object句柄 //自定義初始化函數 void myInit() {glClearColor(0.0, 0.0, 0.0, 0.0);//創建頂點數據 const GLfloat vertices[] = {-0.5f,-0.5f,0.0f,1.0f,0.5f,-0.5f,0.0f,1.0f,0.5f,0.5f,0.0f,1.0f,-0.5f,0.5f,0.0f,1.0f,};//創建VAO對象glGenVertexArrays(1, &vaoId);glBindVertexArray(vaoId);//創建VBO對象 glGenBuffers(1, &vboId);glBindBuffer(GL_ARRAY_BUFFER, vboId);//傳入VBO數據glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//解除VBO綁定glBindBuffer(GL_ARRAY_BUFFER, 0); }//調整窗口大小回調函數 void reshape(int w, int h) {glViewport(0, 0, (GLsizei)w, (GLsizei)h); }//繪制回調函數 void display(void) {glClear(GL_COLOR_BUFFER_BIT);//綁定VBOglBindBuffer(GL_ARRAY_BUFFER, vboId);glEnableVertexAttribArray(0);//解釋頂點數據方式glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);//繪制模型glDrawArrays(GL_TRIANGLE_FAN, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);glDisableVertexAttribArray(0);glutSwapBuffers(); }int main(int argc, char **argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(100, 100);glutInitWindowSize(512, 512);glutCreateWindow("Rectangle demo");//初始化一個GLEW庫,確保OpenGL API對程序完全可用。GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); return;} //自定義初始化,生成VAO,VBO對象myInit();//設置回調函數glutReshapeFunc(reshape);glutDisplayFunc(display);glutMainLoop();return 0; }

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下载及配置的全部內容,希望文章能夠幫你解決所遇到的問題。

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