【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(一)

简介: 【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;

1


部分代码示例 :


// 颜色描述符, 像素格式描述符 , 选取 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);


目录
相关文章
|
C语言 开发者
[笔记]音视频学习之OpenGL篇《一》创建窗口
[笔记]音视频学习之OpenGL篇《一》创建窗口
|
缓存 图形学
计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制
VS+OpenGL绘图环境及基本图形绘制 1、 熟悉OpenGL的主要功能; 2、 掌握OpenGL的绘图流程和原理; 3、 掌握OpenGL核心函数的使用; 4、 熟悉OpenGL基本图形元素的绘制函数。 二. 实验内容 1、 如预备知识所述,创建一个OpenGL工程,修改第一个程序中的Display()函数,如下: 该程序是在窗口中画两条线,分别用黄色和红色绘制。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态: GL_POINTS 画点 GL_LINES 画线
500 0
计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制
|
数据安全/隐私保护 iOS开发 C++
零、Mac 搭建OpenGL 环境
零、Mac 搭建OpenGL 环境
159 0
零、Mac 搭建OpenGL 环境
|
iOS开发 C++ MacOS
Mac环境下OpenGL环境搭建
1.在Xcode内新建一个项目;2.选macOS > APP;3.修改项目名;4.添加OpenGl.framework和GLUT.framework两个依赖库;5.需要的文件include文件包和libGLToos.a;6.新建C++文件 起名为main;7.signing & Capabilities 中证书改为 Sing to Run Locally;8. 记得在Build Settings 中的 Header Search Paths中增加include文件夹的路径;9.加入测试代码 编辑运行
209 0
Mac环境下OpenGL环境搭建
|
Windows
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(二)
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(二)
142 0
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(二)
|
C++
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(一)
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(一)
157 0
【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )(一)
|
Windows
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(二)
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(二)
250 0
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(二)
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(一)
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(一)
259 0
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )(一)
|
机器学习/深度学习 存储 Windows
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(二)
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(二)
157 0
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(二)
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(一)
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(一)
172 0
【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )(一)