【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 : 使用雙緩沖區 , 雙緩沖區可以讓畫面更流暢 ;
部分代碼示例 :
// 顏色描述符, 像素格式描述符 , 選取 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 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenGL】七、桌面窗口搭建 ( 导
- 下一篇: 【OpenGL】九、OpenGL 绘制基