上一篇博客 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 ) 简单介绍 OpenGL 中的一些理论概念 ; 本篇博客开始使用 OpenGL 绘制 点 ;
OpenGL 矩阵环境初始化 , 主要是 投影 ( Projection ) 矩阵 和 模型视图 ( ModelView ) 矩阵 ;
设置 投影 ( Projection ) 矩阵 : 首先要选中投影矩阵 , 告知 GPU 当前要操作的矩阵是投影矩阵 , 然后再进行设置 ; 通过调用 gluPerspective 方法设置投影矩阵参数 , 其四个参数的含义分别是 :
void APIENTRY gluPerspective (
GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar);
设置投影矩阵代码示例 :
// 矩阵环境初始化 , 主要是投影矩阵和模型矩阵
// ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
glMatrixMode(GL_PROJECTION);
// ( 给投影矩阵设置值 ) 向投影矩阵设置参数
// 参数一 : 50.0f 是摄像机的视口角度
// 参数二 : 800.0f / 600.0f 是窗口的宽高比
// 参数三 : 0.1f , 可视的最近的距离
// 参数四 : 1000.0f , 可视的最远距离
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
摄像机的视口角度就是下面的 可视角度 , 视口角度越大 , 可视范围越大 ;
空间中只有处于下面 椎体范围内的物体 , 才能被转到视口中 , 最终 投影到屏幕中显示 , 处于椎体外部的空间无法显示 ;
设置的 参数三 就是 近平面的距离 near , 参数四 就是 远平面距离 far ,
角度 + 近平面 + 远平面 确定了一片三维空间 , 这个空间中就是要在屏幕中显示的空间 ;
设置 模型视图 ( ModelView ) 矩阵 : 首先选中 模型视图 ( ModelView ) 矩阵 , 然后进行设置 , 下面的代码中设置的是一个 单位阵 ;
// 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置
// ( 选中模型矩阵 )
glMatrixMode(GL_MODELVIEW);
// ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
glLoadIdentity();
设置矩阵的套路就是 , 先选中指定的矩阵 , 然后再设置该矩阵 ;
绘制点的操作需要以下几步 , ① 清除缓冲区 , ② 设置当前的颜色 , ③ 设置当前绘制的点的大小 , ④ 开始绘制点 , ⑤ 将缓冲区绘制到前台 ;
每次渲染场景前 , 都需要清除缓冲区 ;
OpenGL 绘制时 , 如果设置帧率为 60 FPS , 每秒中绘制 60 次 , 每次绘制都需要 以 清除缓冲区开始 , 以将缓冲区绘制到前台结束 ;
清除缓冲区示例代码 : 清除缓冲区会在界面中绘制背景颜色 , 该颜色就是之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色 , 该 清除颜色 值也是属于 OpenGL 状态机中的值 ;
// 清除缓冲区 ,
// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
// 红色背景
glClear(GL_COLOR_BUFFER_BIT);
更多细节参考 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 博客 ;
设置当前的绘制颜色 : 调用 glColor4ub 函数设置当前绘制颜色 , 传入的参数是 4 个 unsigned byte 类型的值 ;
四个参数分别是 R 红色 G 绿色 B 蓝色 A 透明度 , 每个颜色分量占 1 字节 , 取值范围 0 ~ 255 ;
代码示例 :
// 设置当前的绘制颜色 , 4 个 unsigned byte
// 每个颜色的分量占一个字节
// 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
// 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
glColor4ub(255, 255, 255, 255);
设置绘制点的大小 , 这里设置的是 20 像素 ;
// 设置绘制点的大小 20 像素
glPointSize(20.0f);
绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来 , 可以调用 glVertex3f 方法设置点 ;
设置了几个点 , 就会绘制几个点 , 如下代码中设置了一个点 , 那么就只绘制这一个点 ;
// 绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
// 可以调用 glVertex3f 方法设置多个点
// 绘制点开始
glBegin(GL_POINTS);
// 设置绘制点的位置
glVertex3f(0.0f, 0.0f, -0.5f);
// 绘制点结束
glEnd();
上述的操作都是缓冲区绘制操作 , 绘制完毕后 , 再调用 SwapBuffers 方法 , 正式将缓冲区绘制到屏幕上 ;
// 将后缓冲区绘制到前台
SwapBuffers(dc);
这里只展示部分代码 , 完整代码可以到 博客源码快照 中查看 , 已上传 CSDN 资源 , 关注即可下载 ;
初始化 OpenGL 相关代码 :
// 创建 OpenGL 的渲染上下文
// 获取窗口设备
dc = GetDC(hWnd);
// 颜色描述符, 像素格式描述符 , 选取 OpenGL 渲染的像素格式
PIXELFORMATDESCRIPTOR pfd;
// 将 PIXELFORMATDESCRIPTOR 结构体清空
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
// 填充结构体
// 设置版本号
pfd.nVersion = 1;
// 结构体大小
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
// 颜色缓冲区 32 位
pfd.cColorBits = 32;
// 深度缓冲区 24 位
pfd.cDepthBits = 24;
pfd.cStencilBits = 8;
// 颜色格式
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.iLayerType = PFD_MAIN_PLANE;
// 分别设置 绘制到桌面窗口 , OpenGL 支持 , 双缓冲 标志位
// 双缓冲区可以让画面更流畅
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
// 选择像素格式 , 如果返回 -1 , 说明选择像素格式失败 , 一般情况下该选择是成功的
int pixelFormat = ChoosePixelFormat(dc, &pfd);
// 设置像素格式
SetPixelFormat(dc, pixelFormat, &pfd);
// 创建 OpenGL 上下文对象 , 注意该操作必须在设置完像素格式后进行操作
HGLRC rc = wglCreateContext(dc);
// 设置 OpenGL 上下文对象 , 将 rc 和 dc 作为当前的渲染设备
wglMakeCurrent(dc, rc);
// 设置清除缓冲区背景颜色
// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
// 对应的参数是 红色 , 绿色 , 蓝色 , 透明度
// 这里设置的是红色
glClearColor(1.0, 0.0, 0.0, 1.0);
// 矩阵环境初始化 , 主要是投影矩阵和模型矩阵
// ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
glMatrixMode(GL_PROJECTION);
// ( 给投影矩阵设置值 ) 向投影矩阵设置参数
// 参数一 : 50.0f 是摄像机的视口角度
// 参数二 : 800.0f / 600.0f 是窗口的宽高比
// 参数三 : 0.1f , 可视的最近的距离
// 参数四 : 1000.0f , 可视的最远距离
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
// 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置
// ( 选中模型矩阵 )
glMatrixMode(GL_MODELVIEW);
// ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
glLoadIdentity();
OpenGL 绘制相关代码 :
// 渲染场景
// 清除缓冲区 ,
// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
// 红色背景
glClear(GL_COLOR_BUFFER_BIT);
// 设置当前的绘制颜色 , 4 个 unsigned byte
// 每个颜色的分量占一个字节
// 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
// 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
glColor4ub(255, 255, 255, 255);
// 设置绘制点的大小 20 像素
glPointSize(20.0f);
// 绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
// 可以调用 glVertex3f 方法设置多个点
// 绘制点开始
glBegin(GL_POINTS);
// 设置绘制点的位置
glVertex3f(0.0f, 0.0f, -0.5f);
// 绘制点结束
glEnd();
// 将后缓冲区绘制到前台
SwapBuffers(dc);
设置的清除缓冲区背景颜色是红色 , 因此整体背景显示的是红色 ,
// 设置清除缓冲区背景颜色
// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
// 对应的参数是 红色 , 绿色 , 蓝色 , 透明度
// 这里设置的是红色
glClearColor(1.0, 0.0, 0.0, 1.0);
设置的 当前绘制颜色 是白色 , 设置当前绘制点的大小 20 像素 , 绘制的效果就是一个 20 像素的点 ;
// 设置当前的绘制颜色 , 4 个 unsigned byte
// 每个颜色的分量占一个字节
// 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
// 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
glColor4ub(255, 255, 255, 255);
// 设置绘制点的大小 20 像素
glPointSize(20.0f);
GitHub 地址 : https://github.com/han1202012/OpenGL
博客源码快照 : https://download.csdn.net/download/han1202012/14505038
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有