文章目录
- 一、OpenGL 状态机概念
- 二、OpenGL 矩阵概念
上一篇博客 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 进行了 OpenGL 渲染环境初始化 ;
本篇博客简单介绍 OpenGL 中的一些理论概念 ;
一、OpenGL 状态机概念
OpenGL 是一个状态机 , 其中包含了很多状态 , 简单列举下面的几项 :
OpenGL 中的 矩阵 Matrix , 包含了 投影 ( Projection ) 矩阵 , 模型 ( Model View ) 矩阵 ,
当前的颜色 Color ,
当前的清除缓冲区颜色 ClearColor ,
点的大小 PointSize ,
线宽度 LineWidth ,
光照 Light
当使用 OpenGL 绘制 3D 图形时 , 就会读取当前的状态机参数 , 利用这些状态机进行绘制 , 而我们就在绘制之前设置上述一系列的状态机 , 确保 OpenGL 绘制按照我们设想的进行 ;
在上一篇博客 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 中Windows 窗口创建完成后 , 初始化 OpenGL 渲染环境 , 调用 wglCreateContext 方法创建了 OpenGL 上下文对象 HGLRC rc 后 , 此时上述的 状态机都是默认的 , 进行相关绘制前 , 都需要 逐个设置相关状态机的值 ; 初始化状态机操作如下 :
设置清除缓冲区颜色 :
代码语言:javascript复制 // 设置清除缓冲区背景颜色
// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
// 对应的参数是 红色 , 绿色 , 蓝色 , 透明度
// 这里设置的是红色
glClearColor(1.0, 0.0, 0.0, 1.0);
初始化矩阵 :
代码语言:javascript复制 // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵
// ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
glMatrixMode(GL_PROJECTION);
// ( 给投影矩阵设置值 ) 向投影矩阵设置参数
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
// ( 选中模型矩阵 )
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
当前颜色值设置 : 绘制元素前 , 将当前的颜色值设为一个值 , 如 白色 , 开始绘制后 , 就会自动使用该颜色进行绘制 ;
稍后会使用 OpenGL 在桌面窗口中绘制一个点 , 绘制前将当前颜色设置为白色 , 然后绘制的点的颜色就是白色 ;
如果想要绘制不同颜色的点 , 就需要在每次绘制前 , 都修改当前颜色值 ;
整个 OpenGL 只有一个当前颜色值 ;
二、OpenGL 矩阵概念
OpenGL 中的 矩阵 Matrix , 包含了 投影 ( Projection ) 矩阵 , 模型 ( Model View ) 矩阵 ,
绘制的 点 定义在 世界坐标系 下 , 是一个三维的点 , 该三维的点需要将其显示到二维屏幕上 ;
模型视口 ( ModelView ) 矩阵 的作用就是将上述 世界坐标系中的三维坐标点 , 放到 视口中 , 视口坐标系是摄像机下的可见范围 ;
摄像机位置 :
右手坐标系 : x 指向屏幕右侧 , y 指向屏幕上方 , z 穿过屏幕指向你 ;
摄像机默认放在上述 右手坐标系 原点 , 指向 z 的负方向 , 即看屏幕里面的方向 ;
因此绘制的时候 , 如果使摄像机在默认位置时 , 需要将要绘制的模型放在 z 的负方向上 , 如下代码是绘制坐标点的代码 :
代码语言:javascript复制 // 设置绘制点的位置
glVertex3f(0.0f, 0.0f, -0.5f);
其绘制位置是 右手坐标系的 屏幕后面 -0.5f 的位置 , 这样正好暴露在摄像机下 ;
投影 ( Projection ) 矩阵 的作用是将 视口 中的模型 , 投影到二维屏幕 ( 显示器 ) 上 ;