【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★
文章目录
- 一、导入 OpenGL 的两个头文件
- 二、链接 OpenGL 库
- 三、将 Windows 桌面窗口改成 OpenGL 窗口
- 四、获取窗口设备
- 五、设置像素格式描述符
- 六、设置像素格式
- 七、创建并设置 OpenGL 上下文对象
- 八、设置清除缓冲区背景颜色
- 九、OpenGL 上下文初始化操作代码示例
- 十、渲染场景
- 十一、相关资源
上一篇博客 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 ) 完成了 桌面初始化的操作 , 注册桌面窗口 , 创建桌面窗口 , 显示桌面窗口 ;
本篇博客开始进行 OpenGL 渲染环境初始化 ;
一、导入 OpenGL 的两个头文件
导入 OpenGL 的两个头文件 : GL.h 和 GLU.h , 需要注意的是 , 注意导入头文件的顺序 , 导入这两个头文件之前 , 必须 先导入 windows.h 头文件 之后再导入 opengl 头文件 , 否则报错 ;
// 导入 OpenGL 的个头文件
// 注意 : 必须先导入 windows.h 头文件之后再导入 opengl 头文件
#include <gl/GL.h>
#include <gl/GLU.h>
二、链接 OpenGL 库
链接 OpenGL 库 :
使用 #pragma comment 预处理指令 , 链接 OpenGL 库 ,
下面代码中使用 #pragma comment(lib, “opengl32.lib”) 预处理指令 , 链接了 opengl32.lib 函数库 , 相当于调用了该库 , 在后续代码中可以使用该 opengl32.lib 函数库中定义的函数 , 这里就可以调用 OpenGL 相关函数了 ;
// 链接 OpenGL 库
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
三、将 Windows 桌面窗口改成 OpenGL 窗口
将 Windows 桌面窗口改成 OpenGL 窗口 :
Windows 创建窗口流程是先 注册窗口 , 然后 创建窗口 , 最后 显示窗口 ;
将 Windows 桌面窗口改成 OpenGL 窗口操作是在 创建窗口完成后 进行的 ;
下面开始逐个步骤讲解 , 如何初始化 OpenGL 窗口 ;
四、获取窗口设备
窗口设备在初始化 OpenGL 上下文 , 和进行 OpenGL 绘制时都需要用到 , 这里设置到全局变量中 ;
// 窗口设备
// 提取到全局变量中
HDC dc = NULL;
调用 CreateWindowW 方法创建窗口后 , 返回 HWND 结构体对象 , 将其传入 GetDC 方法 , 即可获取窗口设备 ;
hInst = hInstance; // 将实例句柄存储在全局变量中// 创建窗口的核心逻辑HWND hWnd = CreateWindowW(szWindowClass, // 窗口主类szTitle, // 窗口标题名称WS_OVERLAPPEDWINDOW, // 窗口风格100 , // x 坐标100 , // y 坐标800, // 宽度600, // 高度nullptr, // 父窗口 nullptr, // 菜单hInstance, // 程序实体nullptr);// 如果创建失败 , 直接退出if (!hWnd){return FALSE;}// 创建 OpenGL 的渲染上下文// 获取窗口设备 ★dc = GetDC(hWnd);
五、设置像素格式描述符
像素格式描述符是 PIXELFORMATDESCRIPTOR 类型的结构体 , 其字段中可以设置
- 颜色缓冲区位数 cColorBits
- 深度缓冲区位数 cDepthBits
- 颜色格式 iPixelType
- 绘制标志位 dwFlags
绘制标志位中可以设置多个标志位 , 如下代码中的标志位含义 :
- PFD_DRAW_TO_WINDOW : 绘制到桌面窗口
- PFD_SUPPORT_OPENGL : 支持 OpenGL
- PFD_DOUBLEBUFFER : 使用双缓冲区 , 双缓冲区可以让画面更流畅 ;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
部分代码示例 :
// 颜色描述符, 像素格式描述符 , 选取 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);
六、设置像素格式
先选择像素格式 , 该操作需要调用 ChoosePixelFormat 方法 , 让系统选择像素格式 , 如果返回 -1 , 说明选择像素格式失败 , 一般情况下该选择是成功的 ;
选择完像素格式之后 , 需要调用 SetPixelFormat 方法设置像素格式 ;
// 选择像素格式 , 如果返回 -1 , 说明选择像素格式失败 , 一般情况下该选择是成功的 int pixelFormat = ChoosePixelFormat(dc, &pfd);// 设置像素格式SetPixelFormat(dc, pixelFormat, &pfd);
七、创建并设置 OpenGL 上下文对象
根据窗口设备创建 OpenGL 上下文对象 , 注意该操作必须在设置完像素格式后进行操作 , 然后设置该 OpenGL 上下文对象 ;
其中 dc 是 窗口设备 , HDC dc = GetDC(hWnd);
// 创建 OpenGL 上下文对象 , 注意该操作必须在设置完像素格式后进行操作HGLRC rc = wglCreateContext(dc);// 设置 OpenGL 上下文对象 , 将 rc 和 dc 作为当前的渲染设备wglMakeCurrent(dc, rc);
八、设置清除缓冲区背景颜色
调用 glClearColor 方法 , 设置清除缓冲区背景颜色 , 传入的四个参数 红色 , 绿色 , 蓝色 , 透明度 值 , 取值范围 0 ~ 1 ;
设置了该清除缓冲区背景颜色后 , 调用 glClear 方法 , 即可擦除当前的颜色缓冲区 , 显示当前的颜色 ;
// 设置清除缓冲区背景颜色// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)// 对应的参数是 红色 , 绿色 , 蓝色 , 透明度// 这里设置的是红色glClearColor(1.0, 0.0, 0.0, 1.0);
九、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);
十、渲染场景
在显示窗口后的 消息循环 中 , 执行渲染相关操作 , 该操作调用频繁 , 基本每秒调用几十次 ;
调用 glClear(GL_COLOR_BUFFER_BIT) , 擦除颜色缓冲区 ,
调用 SwapBuffers 绘制 OpenGL 图像 ;
// 主消息循环:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染场景// 清除缓冲区 , // 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区// 红色背景glClear(GL_COLOR_BUFFER_BIT);// 将后缓冲区绘制到前台SwapBuffers(dc);}
展示效果 :
十一、相关资源
GitHub 地址 : https://github.com/han1202012/OpenGL
博客源码快照 : https://download.csdn.net/download/han1202012/14504132
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★相关推荐
- 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )
文章目录 I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编 ...
- CorelDRAWX4的C++插件开发(三十八)纯C++插件开发(2)导入tlb编译文件
上一节文件建立好了之后,我们把Debug模式改成X86,如果找不到的话,可以在视图-工具栏-标准找到这个界面,因为X4不支持64位的,所以我们只能让他在32位的环境中进行编译调试 然后我们点开顶部项目 ...
- 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...
- ida导入jni头文件_IDA导入Jni.h
IDA 分析Android so 文件时,因为缺少JNIEnv结构定义,反编译后看起来很不友好,如下图(后面注释是我自己手工对照加的 = =).为避免以后无穷无尽的手动加注,接下来我们就来导入 JNI ...
- ida导入jni头文件_IDA动态调试无法导入JNI文件的解决办法
前言:学习过程中遇到了,特此记录一下. 样本app链接在这里: https://pan.baidu.com/s/1pVLBBuBKRzDzHlBClrBA2A 提取码: 9tz8 它是 2015年阿里 ...
- xcode6如何导入全局头文件
如题,之前Xcode5的话是在prefix文件内import一次,就可以全局使用了,xcode6取消了prefix文件,替代的方法是什么呢? 没有什么替代方法,可能是苹果出于对项目构建或其他优化的考虑 ...
- linux 编译查看链接库详情,Linux环境下的编译,链接与库的使用
链接参数控制 链接器中提供了-dn -dy 参数来控制使用的是动态库还是静态库,-dn表示后面使用的是静态库,-dy表示使用的是动态库 例: g++ -Lpath -Wl,-dn -lx -Wl,-d ...
- 【catkin】——如何导入一个catkin包的头文件和动态库
catkin 1. find_package(catkin) find_package(catkin REQUIRED COMPONENTS gflags_catkin glog_catkin ope ...
- 【OpenGL从入门到精通(一)】Windows搭建OpenGL的渲染环境,并初始化一个OPenGL窗口
注意:需要在Windows 窗口程序下,而不能是控制台程序,Windows平台的VS下已经包含了OpenGL相关的API,可以直接引用 #include <windows.h> #incl ...
最新文章
- c语言 mysql_bind,C语言连接SQLSERVER数据库
- 运动学与雅可比矩阵举例
- 华为3com交换路由命令详解
- JSP中的include指令
- 我的核心技术都是从哪里学到的?如何提高成长的?分享给大家。
- pmos导通条件 图示_如何判断NMOS管和PMOS管
- Android ActionBar高级自定义——设置标题居中和添加控件
- spring 注解重复(防重复请求)
- C++ byte数组/char数组 转 int16 int32
- 编写一个应用程序,给出汉字“你”“我”“他”在Unicode表中的位置
- 一次成功编译Bilibili安卓播放器
- java将图片url转换成数据流输出到前端
- C语言 【程序30】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
- 纵论物联网(十一):蓝牙技术的发展
- 论文阅读-基于遗传算法的NAS
- 洛谷题单1-7 搜索题解
- java基础巩固-宇宙第一AiYWM:为了维持生计,多高(多线程与高并发)_Part7~整起(打手集团【线程池】)
- 漩涡中的中国首富李彦宏
- 爬虫中常用的加密逻辑(python实现)
- Linux基础之命令【ls】