【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★
文章目錄
- 一、導(dǎo)入 OpenGL 的兩個(gè)頭文件
- 二、鏈接 OpenGL 庫
- 三、將 Windows 桌面窗口改成 OpenGL 窗口
- 四、獲取窗口設(shè)備
- 五、設(shè)置像素格式描述符
- 六、設(shè)置像素格式
- 七、創(chuàng)建并設(shè)置 OpenGL 上下文對(duì)象
- 八、設(shè)置清除緩沖區(qū)背景顏色
- 九、OpenGL 上下文初始化操作代碼示例
- 十、渲染場(chǎng)景
- 十一、相關(guān)資源
上一篇博客 【OpenGL】七、桌面窗口搭建 ( 導(dǎo)入頭文件 | 桌面程序入口函數(shù) | 注冊(cè)窗口 | 創(chuàng)建窗口 | 顯示窗口 ) 完成了 桌面初始化的操作 , 注冊(cè)桌面窗口 , 創(chuàng)建桌面窗口 , 顯示桌面窗口 ;
本篇博客開始進(jìn)行 OpenGL 渲染環(huán)境初始化 ;
一、導(dǎo)入 OpenGL 的兩個(gè)頭文件
導(dǎo)入 OpenGL 的兩個(gè)頭文件 : GL.h 和 GLU.h , 需要注意的是 , 注意導(dǎo)入頭文件的順序 , 導(dǎo)入這兩個(gè)頭文件之前 , 必須 先導(dǎo)入 windows.h 頭文件 之后再導(dǎo)入 opengl 頭文件 , 否則報(bào)錯(cuò) ;
// 導(dǎo)入 OpenGL 的個(gè)頭文件 // 注意 : 必須先導(dǎo)入 windows.h 頭文件之后再導(dǎo)入 opengl 頭文件 #include <gl/GL.h> #include <gl/GLU.h>二、鏈接 OpenGL 庫
鏈接 OpenGL 庫 :
使用 #pragma comment 預(yù)處理指令 , 鏈接 OpenGL 庫 ,
下面代碼中使用 #pragma comment(lib, “opengl32.lib”) 預(yù)處理指令 , 鏈接了 opengl32.lib 函數(shù)庫 , 相當(dāng)于調(diào)用了該庫 , 在后續(xù)代碼中可以使用該 opengl32.lib 函數(shù)庫中定義的函數(shù) , 這里就可以調(diào)用 OpenGL 相關(guān)函數(shù)了 ;
// 鏈接 OpenGL 庫 #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glu32.lib")三、將 Windows 桌面窗口改成 OpenGL 窗口
將 Windows 桌面窗口改成 OpenGL 窗口 :
Windows 創(chuàng)建窗口流程是先 注冊(cè)窗口 , 然后 創(chuàng)建窗口 , 最后 顯示窗口 ;
將 Windows 桌面窗口改成 OpenGL 窗口操作是在 創(chuàng)建窗口完成后 進(jìn)行的 ;
下面開始逐個(gè)步驟講解 , 如何初始化 OpenGL 窗口 ;
四、獲取窗口設(shè)備
窗口設(shè)備在初始化 OpenGL 上下文 , 和進(jìn)行 OpenGL 繪制時(shí)都需要用到 , 這里設(shè)置到全局變量中 ;
// 窗口設(shè)備 // 提取到全局變量中 HDC dc = NULL;調(diào)用 CreateWindowW 方法創(chuàng)建窗口后 , 返回 HWND 結(jié)構(gòu)體對(duì)象 , 將其傳入 GetDC 方法 , 即可獲取窗口設(shè)備 ;
hInst = hInstance; // 將實(shí)例句柄存儲(chǔ)在全局變量中// 創(chuàng)建窗口的核心邏輯HWND hWnd = CreateWindowW(szWindowClass, // 窗口主類szTitle, // 窗口標(biāo)題名稱WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格100 , // x 坐標(biāo)100 , // y 坐標(biāo)800, // 寬度600, // 高度nullptr, // 父窗口 nullptr, // 菜單hInstance, // 程序?qū)嶓wnullptr);// 如果創(chuàng)建失敗 , 直接退出if (!hWnd){return FALSE;}// 創(chuàng)建 OpenGL 的渲染上下文// 獲取窗口設(shè)備 ★dc = GetDC(hWnd);五、設(shè)置像素格式描述符
像素格式描述符是 PIXELFORMATDESCRIPTOR 類型的結(jié)構(gòu)體 , 其字段中可以設(shè)置
- 顏色緩沖區(qū)位數(shù) cColorBits
- 深度緩沖區(qū)位數(shù) cDepthBits
- 顏色格式 iPixelType
- 繪制標(biāo)志位 dwFlags
繪制標(biāo)志位中可以設(shè)置多個(gè)標(biāo)志位 , 如下代碼中的標(biāo)志位含義 :
- PFD_DRAW_TO_WINDOW : 繪制到桌面窗口
- PFD_SUPPORT_OPENGL : 支持 OpenGL
- PFD_DOUBLEBUFFER : 使用雙緩沖區(qū) , 雙緩沖區(qū)可以讓畫面更流暢 ;
部分代碼示例 :
// 顏色描述符, 像素格式描述符 , 選取 OpenGL 渲染的像素格式PIXELFORMATDESCRIPTOR pfd;// 將 PIXELFORMATDESCRIPTOR 結(jié)構(gòu)體清空memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));// 填充結(jié)構(gòu)體// 設(shè)置版本號(hào)pfd.nVersion = 1;// 結(jié)構(gòu)體大小pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);// 顏色緩沖區(qū) 32 位pfd.cColorBits = 32;// 深度緩沖區(qū) 24 位pfd.cDepthBits = 24;pfd.cStencilBits = 8;// 顏色格式pfd.iPixelType = PFD_TYPE_RGBA;pfd.iLayerType = PFD_MAIN_PLANE;// 分別設(shè)置 繪制到桌面窗口 , OpenGL 支持 , 雙緩沖 標(biāo)志位 // 雙緩沖區(qū)可以讓畫面更流暢 pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;// 選擇像素格式 , 如果返回 -1 , 說明選擇像素格式失敗 , 一般情況下該選擇是成功的 int pixelFormat = ChoosePixelFormat(dc, &pfd);// 設(shè)置像素格式SetPixelFormat(dc, pixelFormat, &pfd);六、設(shè)置像素格式
先選擇像素格式 , 該操作需要調(diào)用 ChoosePixelFormat 方法 , 讓系統(tǒng)選擇像素格式 , 如果返回 -1 , 說明選擇像素格式失敗 , 一般情況下該選擇是成功的 ;
選擇完像素格式之后 , 需要調(diào)用 SetPixelFormat 方法設(shè)置像素格式 ;
// 選擇像素格式 , 如果返回 -1 , 說明選擇像素格式失敗 , 一般情況下該選擇是成功的 int pixelFormat = ChoosePixelFormat(dc, &pfd);// 設(shè)置像素格式SetPixelFormat(dc, pixelFormat, &pfd);七、創(chuàng)建并設(shè)置 OpenGL 上下文對(duì)象
根據(jù)窗口設(shè)備創(chuàng)建 OpenGL 上下文對(duì)象 , 注意該操作必須在設(shè)置完像素格式后進(jìn)行操作 , 然后設(shè)置該 OpenGL 上下文對(duì)象 ;
其中 dc 是 窗口設(shè)備 , HDC dc = GetDC(hWnd);
// 創(chuàng)建 OpenGL 上下文對(duì)象 , 注意該操作必須在設(shè)置完像素格式后進(jìn)行操作HGLRC rc = wglCreateContext(dc);// 設(shè)置 OpenGL 上下文對(duì)象 , 將 rc 和 dc 作為當(dāng)前的渲染設(shè)備wglMakeCurrent(dc, rc);八、設(shè)置清除緩沖區(qū)背景顏色
調(diào)用 glClearColor 方法 , 設(shè)置清除緩沖區(qū)背景顏色 , 傳入的四個(gè)參數(shù) 紅色 , 綠色 , 藍(lán)色 , 透明度 值 , 取值范圍 0 ~ 1 ;
設(shè)置了該清除緩沖區(qū)背景顏色后 , 調(diào)用 glClear 方法 , 即可擦除當(dāng)前的顏色緩沖區(qū) , 顯示當(dāng)前的顏色 ;
// 設(shè)置清除緩沖區(qū)背景顏色// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)// 對(duì)應(yīng)的參數(shù)是 紅色 , 綠色 , 藍(lán)色 , 透明度// 這里設(shè)置的是紅色glClearColor(1.0, 0.0, 0.0, 1.0);九、OpenGL 上下文初始化操作代碼示例
// 創(chuàng)建 OpenGL 的渲染上下文// 獲取窗口設(shè)備 dc = GetDC(hWnd);// 顏色描述符, 像素格式描述符 , 選取 OpenGL 渲染的像素格式PIXELFORMATDESCRIPTOR pfd;// 將 PIXELFORMATDESCRIPTOR 結(jié)構(gòu)體清空memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));// 填充結(jié)構(gòu)體// 設(shè)置版本號(hào)pfd.nVersion = 1;// 結(jié)構(gòu)體大小pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);// 顏色緩沖區(qū) 32 位pfd.cColorBits = 32;// 深度緩沖區(qū) 24 位pfd.cDepthBits = 24;pfd.cStencilBits = 8;// 顏色格式pfd.iPixelType = PFD_TYPE_RGBA;pfd.iLayerType = PFD_MAIN_PLANE;// 分別設(shè)置 繪制到桌面窗口 , OpenGL 支持 , 雙緩沖 標(biāo)志位 // 雙緩沖區(qū)可以讓畫面更流暢 pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;// 選擇像素格式 , 如果返回 -1 , 說明選擇像素格式失敗 , 一般情況下該選擇是成功的 int pixelFormat = ChoosePixelFormat(dc, &pfd);// 設(shè)置像素格式SetPixelFormat(dc, pixelFormat, &pfd);// 創(chuàng)建 OpenGL 上下文對(duì)象 , 注意該操作必須在設(shè)置完像素格式后進(jìn)行操作HGLRC rc = wglCreateContext(dc);// 設(shè)置 OpenGL 上下文對(duì)象 , 將 rc 和 dc 作為當(dāng)前的渲染設(shè)備wglMakeCurrent(dc, rc); // 設(shè)置清除緩沖區(qū)背景顏色// glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)// 對(duì)應(yīng)的參數(shù)是 紅色 , 綠色 , 藍(lán)色 , 透明度// 這里設(shè)置的是紅色glClearColor(1.0, 0.0, 0.0, 1.0);
十、渲染場(chǎng)景
在顯示窗口后的 消息循環(huán) 中 , 執(zhí)行渲染相關(guān)操作 , 該操作調(diào)用頻繁 , 基本每秒調(diào)用幾十次 ;
調(diào)用 glClear(GL_COLOR_BUFFER_BIT) , 擦除顏色緩沖區(qū) ,
調(diào)用 SwapBuffers 繪制 OpenGL 圖像 ;
// 主消息循環(huán):while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染場(chǎng)景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 將后緩沖區(qū)繪制到前臺(tái)SwapBuffers(dc);}展示效果 :
十一、相關(guān)資源
GitHub 地址 : https://github.com/han1202012/OpenGL
博客源碼快照 : https://download.csdn.net/download/han1202012/14504132
總結(jié)
以上是生活随笔為你收集整理的【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenGL】七、桌面窗口搭建 ( 导
- 下一篇: 【OpenGL】九、OpenGL 绘制基