天天看點

【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月,且該項目似乎已經被廢棄。它的許可證禁止任何人釋出修改後的庫代碼。

【OpenGL學習】glut和freeglut下載下傳及配置

 glut32.dll和glut.dll有什麼差別?glut32.dll是為微軟封裝的,官方的。而glut.dll是sgi封裝的。 

 官網位址:

​​GLUT - The OpenGL Utility Toolkit​​​​http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip​​

【OpenGL學習】glut和freeglut下載下傳及配置

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位的編譯環境。 

【OpenGL學習】glut和freeglut下載下傳及配置
【OpenGL學習】glut和freeglut下載下傳及配置

官網位址:

​​​http://freeglut.sourceforge.net/​​​​freeglut download | SourceForge.net​​

Martin Payne's Windows binaries (MSVC and MinGW):​​http://www.transmissionzero.co.uk/software/freeglut-devel/​​

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繪制一個三角形

#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);
 
    //綁定VBO
    glBindBuffer(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;
}      

後續

繼續閱讀