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基本框架

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