文章目录

  • 一、导入 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 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★相关推荐

  1. 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )

    文章目录 I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编 ...

  2. CorelDRAWX4的C++插件开发(三十八)纯C++插件开发(2)导入tlb编译文件

    上一节文件建立好了之后,我们把Debug模式改成X86,如果找不到的话,可以在视图-工具栏-标准找到这个界面,因为X4不支持64位的,所以我们只能让他在32位的环境中进行编译调试 然后我们点开顶部项目 ...

  3. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  4. ida导入jni头文件_IDA导入Jni.h

    IDA 分析Android so 文件时,因为缺少JNIEnv结构定义,反编译后看起来很不友好,如下图(后面注释是我自己手工对照加的 = =).为避免以后无穷无尽的手动加注,接下来我们就来导入 JNI ...

  5. ida导入jni头文件_IDA动态调试无法导入JNI文件的解决办法

    前言:学习过程中遇到了,特此记录一下. 样本app链接在这里: https://pan.baidu.com/s/1pVLBBuBKRzDzHlBClrBA2A 提取码: 9tz8 它是 2015年阿里 ...

  6. xcode6如何导入全局头文件

    如题,之前Xcode5的话是在prefix文件内import一次,就可以全局使用了,xcode6取消了prefix文件,替代的方法是什么呢? 没有什么替代方法,可能是苹果出于对项目构建或其他优化的考虑 ...

  7. linux 编译查看链接库详情,Linux环境下的编译,链接与库的使用

    链接参数控制 链接器中提供了-dn -dy 参数来控制使用的是动态库还是静态库,-dn表示后面使用的是静态库,-dy表示使用的是动态库 例: g++ -Lpath -Wl,-dn -lx -Wl,-d ...

  8. 【catkin】——如何导入一个catkin包的头文件和动态库

    catkin 1. find_package(catkin) find_package(catkin REQUIRED COMPONENTS gflags_catkin glog_catkin ope ...

  9. 【OpenGL从入门到精通(一)】Windows搭建OpenGL的渲染环境,并初始化一个OPenGL窗口

    注意:需要在Windows 窗口程序下,而不能是控制台程序,Windows平台的VS下已经包含了OpenGL相关的API,可以直接引用 #include <windows.h> #incl ...

最新文章

  1. c语言 mysql_bind,C语言连接SQLSERVER数据库
  2. 运动学与雅可比矩阵举例
  3. 华为3com交换路由命令详解
  4. JSP中的include指令
  5. 我的核心技术都是从哪里学到的?如何提高成长的?分享给大家。
  6. pmos导通条件 图示_如何判断NMOS管和PMOS管
  7. Android ActionBar高级自定义——设置标题居中和添加控件
  8. spring 注解重复(防重复请求)
  9. C++ byte数组/char数组 转 int16 int32
  10. 编写一个应用程序,给出汉字“你”“我”“他”在Unicode表中的位置
  11. 一次成功编译Bilibili安卓播放器
  12. java将图片url转换成数据流输出到前端
  13. C语言 【程序30】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
  14. 纵论物联网(十一):蓝牙技术的发展
  15. 论文阅读-基于遗传算法的NAS
  16. 洛谷题单1-7 搜索题解
  17. java基础巩固-宇宙第一AiYWM:为了维持生计,多高(多线程与高并发)_Part7~整起(打手集团【线程池】)
  18. 漩涡中的中国首富李彦宏
  19. 爬虫中常用的加密逻辑(python实现)
  20. Linux基础之命令【ls】

热门文章

  1. 使用thrift进行跨语言调用(php c# java)
  2. Mongodb-初步了解
  3. 心得体悟帖---18、时间
  4. flask之flask_socketio
  5. CodeForces - 981G Magic multisets
  6. 我总结的js性能优化的小知识
  7. Android中配置JDK和SDK的环境变量
  8. HDOJ 1224 Free DIY Tour
  9. prism4.0——chapter 2:初始化Prism应用
  10. OK,让我们开始吧!