網站首頁 編程語言 正文
效果展示
窗口創建并啟動渲染循環
/*
因為OpenGL只是一個標準/規范,具體的實現是由驅動開發商針對特定顯卡實現的。
由于OpenGL驅動版本眾多,它大多數函數的位置都無法在編譯時確定下來,需要在運行時查詢。
所以任務就落在了開發者身上,開發者需要在運行時獲取函數地址并將其保存在一個函數指針中供以后使用。
GLAD是一個開源的庫,它能解決我們上面提到的獲取函數地址并將其保存在一個函數指針中供以后使用繁瑣的問題
*/
#include <glad/glad.h>
/*
GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物體所需的最低限度的接口。它允許用戶創建OpenGL上下文、定義窗口參數以及處理用戶輸入.
*/
#include <GLFW/glfw3.h>
/*
C++標準庫
*/
#include <iostream>
// 視口修改的函數
void framebuffer_size_callback(GLFWwindow* window,int width,int height) {
glViewport(0,0,width,height);
}
// 讓所有的輸入代碼保持整潔
void processInput(GLFWwindow *window) {
if (glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window,true);
}
}
int main()
{
// 初始化GLFW
glfwInit();
// 配置GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// 設置主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 設置次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用的是核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // MacOSX系統才需要設置
// 創建一個窗口對象
GLFWwindow* window = glfwCreateWindow(800,600,"LearnOpenGL",NULL,NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// GLAD是用來管理OpenGL的函數指針的,所以再調用任何OpenGL的函數之前我們需要初始化GLAD
// 我們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給我們的是glfwGetProcAddress,它根據我們編譯的系統定義了正確的函數
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 告訴OpenGL渲染窗口的尺寸大小,即視口大小
// OpenGL幕后使用glViewport中定義的位置和寬高進行2D坐標的轉換、將OpenGL中的位置坐標轉換為你的屏幕坐標。處理過的OpenGL坐標范圍只為-1到1,然后映射到(0,800)和(0,600)
glViewport(0,0,800,600);// 設置窗口的維度
// 用戶改變窗口的大小的時候,視口也應該被調整
// 對窗口注冊一個回調函數(Callback Function)
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);
// 還可以將我們的函數注冊到其它很多的回調函數中。例如我們可以創建一個回調函數來處理手柄輸入變化,處理錯誤消息等。我們會在創建窗口之后,渲染循環初始化之前注冊這些回調函數
// 添加渲染循環
while (!glfwWindowShouldClose(window)) {// 該函數在我們每次循環的開始前檢查依次GLFW是否被要求推出,如果是的話函數返回true然后渲染循環便結束了,之后我們就可以關閉應用程序了
// 輸入
processInput(window);
// 渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 設置清空屏幕所用的顏色(此函數是一個狀態設置函數)
glClear(GL_COLOR_BUFFER_BIT);// 清除顏色緩沖(是一個狀態使用函數)
// 檢查并調用事件,交換緩沖
glfwSwapBuffers(window);// 函數會交換顏色緩沖(它是一個儲存著GLFW窗口每一個像素顏色值的大緩沖),它在這一迭代中被用來繪制,并且將會作為輸出顯示在屏幕上
glfwPollEvents();// 函數檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態,并調用對應的回調函數(可以通過回調方法手動設置)。
}
/*雙緩沖(Double Buffer)
應用程序使用單緩沖繪圖時可能會存在圖像閃爍的問題。 這是因為生成的圖像不是一下子被繪制出來的,而是按照從左到右,由上而下逐像素地繪制而成的。
最終圖像不是在瞬間顯示給用戶,而是通過一步一步生成的,這會導致渲染的結果很不真實。為了規避這些問題,我們應用雙緩沖渲染窗口應用程序。
前緩沖保存著最終輸出的圖像,它會在屏幕上顯示;而所有的的渲染指令都會在后緩沖上繪制。
當所有的渲染指令執行完畢后,我們交換(Swap)前緩沖和后緩沖,這樣圖像就立即呈顯出來,之前提到的不真實感就消除了。
*/
glfwTerminate();
return 0;
}
參考資料
【1】LearnOpenGL
原文鏈接:https://blog.csdn.net/MichaelKongChina/article/details/124201572
相關推薦
- 2022-09-17 C++中stack的pop()函數返回值解析_C 語言
- 2022-03-31 C語言類的基本語法詳解_C 語言
- 2024-04-02 Springboot 切換Log4j2日志
- 2022-11-11 C++?左值引用與一級指針示例詳解_C 語言
- 2022-10-27 React狀態管理Redux原理與介紹_React
- 2022-05-29 C#使用DirectX.DirectSound播放語音_C#教程
- 2024-02-01 QueryWrapper、LambdaQueryWrapper、QueryChainWrapper、
- 2023-04-04 python中class(object)的含義是什么以及用法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支