OpenGl--实战操作详解(创建几何图形三角形、球、环、圆柱、锥、磁盘)
一、引用头文件
#include "GLTools.h" //OpenGL工具类:包含大部分GLTools中类似C语言的独立函数
#include "GLMatrixStack.h" //矩阵堆栈工具类:用于加载单元矩阵、矩阵相乘、压栈、出栈、缩放、平移、旋转等操作
#include "GLFrame.h" //矩阵工具类:表示位置,通过vOrigin、vForward、vUp定义
#include "GLFrustum.h" //矩阵工具类:用于快速设置正投影、透视投影矩阵,完成坐标从3D->2D的映射过程
#include "GLBatch.h" //三角形批次类:用于传输顶点、光照、纹理、颜色等数据到存储着色器
#include "GLGeometryTransform.h" //变换管道类:用于快速在代码中传输视图矩阵、投影矩阵、视图投影变换矩阵等
#include <math.h> //数学库
二、相关属性
GLShaderManagershaderManager; //存储着色器管理者
GLMatrixStackmodelViewMatrix; //模型视图矩阵
GLMatrixStackprojectionMatrix; //投影矩阵
GLFramecameraFrame; //角色帧:摄像机、观察者位置
GLFrame objectFrame; //角色帧;物体、世界坐标位置
GLFrustumviewFrustum; //视景体,用来构造投影矩阵
//三角形批次类
GLTriangleBatch sphereBatch; //球
GLTriangleBatch torusBatch; //环
GLTriangleBatch cylinderBatch; //圆柱
GLTriangleBatch coneBatch; //锥
GLTriangleBatch diskBatch; //磁盘
GLGeometryTransformtransformPipeline; //变换管道,存储模型视图、投影、模型视图投影矩阵
三、相关函数
1.main函数
程序入口函数,OpenGL为面向过程编程,所以OpenGL及其封装的图形图像处理框架,处理过程都是以链式形式进行的。
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
//申请一个颜色缓存区、深度缓存区、双缓存区、模板缓存区
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
//设置window大小
glutInitWindowSize(800, 600);
//设置window名称
glutCreateWindow("Sphere");
//注册函数:窗口大小变化
glutReshapeFunc(ChangeSize);
//注册函数:键盘”空格”键的回调函数
glutKeyboardFunc(KeyPressFunc);
//注册函数:键盘“上、下、左、右”键的回调函数
glutSpecialFunc(SpecialKeys);
//注册函数:鼠标右键菜单栏
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("Menu1", 1);
glutAddMenuEntry("Menu2", 2);
glutAddMenuEntry("Menu3", 3);
//注册函数:渲染函数
glutDisplayFunc(RenderScene);
//判断glew库是否初始化成功,确保OpenGL框架的正常运行
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
//自定义函数:设置需要渲染图形的顶点数据、颜色数据等
SetupRC();
//runloop执行循环
glutMainLoop();
return 0;
}
2.自定义重塑函数
当屏幕大小发生变化,或者第一次创建窗口时调用该函数。通过glutReshapFunc(函数名)注册。(需在main函数中通过注册调用)
void ChangeSize(int w, int h)
{
//1.防止h变为0
if(h == 0)
h = 1;
//2.设置视口窗口尺寸