OpenGL基本框架
int main(char *argc, char **argv)
- 初始化窗口顯現模式、窗口位置、窗口大小和窗口名稱。
- 對OpenGL進行配置
- 調用繪製函數、重置窗口函數和鍵盤交互函數
- 主循環
int InitGL()
- 啓用陰影平滑,顏色平滑過度
- 清除屏幕爲黑色背景
- 設置深度緩存、啓用深度測試、調用深度測試的類型
- 視圖修正
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
- 防止被0除處理
- 設置窗口大小
- 增加透視投影
- 設置觀察視口
- 選擇模型觀察矩陣
void Keyboard(unsigned char key, int x, int y)
- 選擇鍵盤按鍵,做出相應操作
基本框架代碼(來源NeHe):
#include <iostream>
using namespace std;
#include <gl/freeglut.h>
#include <Windows.h>
bool fullScreen = false; // true 切換全屏
int InitGL(GLvoid) // 對OpenGL進行設置,窗口創建之後纔會被調用
{
glShadeModel(GL_SMOOTH); //啓用陰影平滑 顏色平滑過渡
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 清除屏幕爲黑色背景顏色
// depth buffer 深度緩存(屏幕後面的層0.1f - 100.0f 深度)
// 深度排序決定那個物體先畫
glClearDepth(1.0f); // 設置深度緩存
glEnable(GL_DEPTH_TEST); // 啓用深度測試
glDepthFunc(GL_LEQUAL); // 所作深度測試的類型
// 最好的透視修正 使視圖看起來更好
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return true;
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height == 0) // 防止除0
{
height = 1;
}
// 重置窗口大小
glViewport(0, 0, width, height);
/* 創建現實外觀場景,越遠的東西看起來越小。 爲透視圖設置屏幕,
** 透視基於窗口寬度和高度的45度視角計算。
** 0.1f, 100.0f 場景中繪製深度的起點和終點
*/
//投影矩陣負責爲場景增加透視
glMatrixMode(GL_PROJECTION); // 投影矩陣模式 接下來的兩行代碼將影響投影矩陣
glLoadIdentity(); // 它將所選的矩陣狀態恢復成其原始狀態。
// 設置視口大小
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
// 模型視圖 存放物體訊息
glMatrixMode(GL_MODELVIEW); // 選擇模型觀察矩陣 指明任何新的變換將會影響模型觀察矩陣。
glLoadIdentity(); // 重置模型觀察矩陣
}
void Keyboard(unsigned char key, int x, int y) // 鍵盤交互
{
switch (key)
{
case 27: // ESC ASCII碼 27
exit(0);
break;
case VK_RETURN: // 回車鍵觸發全屏命令
{
fullScreen = !fullScreen;
if (fullScreen) // 是否爲true?
{
glutFullScreen(); // glut全屏命令
}
break;
}
default:
cout << "鍵盤輸入有誤,請重新輸入!" << endl;
break;
}
}
void DrawGLScene(GLvoid) // 此過程中包含所有的繪製代碼
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glutSwapBuffers(); // 交換緩存,
}
int main(int argc, char** argv)
{
cout << "回車切換全屏或銷燬窗口" << endl;
// 初始化窗口
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // 呈現模式 顏色RGB 雙緩存
glutInitWindowPosition(0, 0); // 窗口左上角位置
glutInitWindowSize(800, 500); // 窗口大小
glutCreateWindow("Lesson 01 - Setting Up OpenGL In Windows"); // 窗口名
InitGL(); // 對OpenGL進行設置
glutDisplayFunc(DrawGLScene); // 繪製函數
glutReshapeFunc(ReSizeGLScene); // 重置OpenGL窗口大小
glutKeyboardFunc(Keyboard); // 鍵盤交互
glutMainLoop(); // 主循壞
return 0;
}
結果
就是一個窗口,因爲什麼圖形都沒有繪製。