天天看點

Linux OpenGL 實踐篇-2 建立一個視窗

OpenGL 作為一個圖形接口,并沒有包含視窗的相關内容,但OpenGL使用必須依賴視窗,即必須在視窗中繪制。這就要求我們必須了解一種視窗系統,但不同的作業系統提供的建立視窗的API都不相同,如果我們在學習OpenGL時要去學習一整套的視窗系統,這将帶來很多的不便,是以出現了GLUT。GLUT全稱OpenGL Utility Toolkit,是一套和視窗系統無關的軟體包,為我們提供了視窗建立,使用者輸入輸出處理等功能。優點是:簡小,精悍。注意GLUT并不是一個功能特别全面的視窗系統工具包,是以建構大型應用的時候還是需要根據需求選擇相應的本機視窗系統工具包。

FreeGLUT

GLUT現有兩個發行版:freeglut和原始版本的glut。原始glut的更新并沒有随着opengl的發展而保持更新,是以本實踐中采用的是freeglut。

GLUT的基本流程包括四步:

1)初始化GLUT庫;

2)建立GLUT視窗;

3)注冊display()回調函數;

4)進入GLUT主循環;

示例:

#include <iostream>
#include <GLUT/freeglut.h>//freeGLUT視窗庫

/**
 * 渲染回調函數
 */
void Render(){
    // 清空顔色緩存
    glClear(GL_COLOR_BUFFER_BIT);
    // 交換前後緩存
    glutSwapBuffers();
}

/**
 * 主函數
 */
int main(int argc, char ** argv) {
    
    // 初始化GLUT
    glutInit(&argc, argv);
    
    // 顯示模式:雙緩沖、RGBA
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    
    // 視窗設定
    glutInitWindowSize(640, 480);      // 視窗尺寸
    glutInitWindowPosition(100, 100);  // 視窗位置
    glutCreateWindow("GLUT Window");   // 視窗标題
    
    // 開始渲染
    glutDisplayFunc(Render);
    
    // 緩存清空後的顔色值
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
    // 通知開始GLUT的内部循環
    glutMainLoop();
  
    return 0;
}      

glut初始化

在使用glut之前,一定要初始化glut庫。函數原型為:

void glutInit(int argc,char **argv);

接下來可設定glut的一些屬性。

配置顯示特性

void glutInitDisplayMode(unsigned int mode);

mode 預設為GLUT_INDEX\GLUT_SINGLE、GLUT_DEPTH的按位組合。

配置OpenGL版本

void glutInitContextVersion(int majorVersion, int minorVersion);

配置建立的上下文資訊

void  glutInitContextProfile(int profile)

core版本:GLUT_CORE_PROFILE;

相容性版本:GLUT_COMPATIBILITY_PROFILE;

建立視窗

int glutCreateWindow(char* name);

設定視窗位置和大小

void glutInitWindowSize(int width,int height);

void glutInitWindowPosition(int x, int y);

設定渲染函數

void glutDisplayFunc(void (*func)(void));

視窗變化回調函數

void glutReshapeFunc(void (*func)(int width, int height));

鍵盤按鍵事件監聽

 void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));

void glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));

滑鼠事件監聽

void glutMouseFunc(void (*func)(int button, int state, int x, int y)); //滑鼠被按下是觸發

void glutMotionFunc(void (*func)(int x, int y));//按下滑鼠按鈕并在視窗内移動觸發

void glutPassiveMotionFunc(void (*func)(int x, int y));//滑鼠指針在視窗内移動

視窗重繪标記

void  glutPostRedisplay(void);标記視窗需要重繪,在下一次的執行過程中,将調用渲染函數。

背景管理

void glutIdleFunc(void (*func)(void));//當沒有其它事件需要處理時的時候調用func,典型應用如動畫

事件循環

void glutMainLoop();//永遠不會傳回

繼續閱讀