GLUT實現的OpenGL(NeHe)之Lesson 01 - Setting Up OpenGL In Windows

OpenGL基本框架

int main(char *argc, char **argv)
  1. 初始化窗口顯現模式、窗口位置、窗口大小和窗口名稱。
  2. 對OpenGL進行配置
  3. 調用繪製函數、重置窗口函數和鍵盤交互函數
  4. 主循環
int InitGL()
  1. 啓用陰影平滑,顏色平滑過度
  2. 清除屏幕爲黑色背景
  3. 設置深度緩存、啓用深度測試、調用深度測試的類型
  4. 視圖修正
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
  1. 防止被0除處理
  2. 設置窗口大小
  3. 增加透視投影
  4. 設置觀察視口
  5. 選擇模型觀察矩陣
void Keyboard(unsigned char key, int x, int y)
  1. 選擇鍵盤按鍵,做出相應操作
基本框架代碼(來源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;
}

結果

就是一個窗口,因爲什麼圖形都沒有繪製。
OpenGL基本框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章