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;
}
结果
就是一个窗口,因为什么图形都没有绘制。