【OpenGL學習】(一)創建窗口

文章目錄

  • 【OpenGL學習】(一)創建窗口

【OpenGL學習】(一)創建窗口

GLFW

OpenGL 本身只是一套圖形渲染 API,不提供窗口創建、上下文管理或輸入處理的功能。
GLFW 是一個支持創建窗口、處理鍵盤鼠標輸入和管理 OpenGL 上下文的跨平臺庫。因此,可以將OpenGL 和GLFW結合使用。

注:除了 GLFW,OpenGL 也可以與其他 GUI 框架如 Qt、MFC、SDL 等結合使用,實現更復雜或平臺特定的圖形界面程序。

GLAD

OpenGL 是一個跨平臺的圖形 API,其函數并非直接由操作系統或編譯器提供,而是通過顯卡驅動動態加載。這些函數的地址需要你在程序運行時手動獲取,例如:

// 定義一個函數指針類型 GLGENBUFFERSPROC,用于指向 glGenBuffers 函數。
typedef void (*GLGENBUFFERSPROC)(GLsizei, GLuint*);
// 使用 wglGetProcAddress 函數動態加載 OpenGL 的 glGenBuffers 函數。
GLGENBUFFERSPROC glGenBuffers = (GLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");

每一個函數你都得這么寫,非常繁瑣。

GLAD是一個OpenGL函數加載庫,可以自動加載與指定OpenGL版本相關的所有函數指針,避免了繁瑣的手動獲取,讓我們可以像普通函數一樣直接調用它們。

示例:創建窗口

#include <glad/glad.h>  // 用于加載 OpenGL 函數指針
#include <GLFW/glfw3.h> // 用于創建窗口和處理用戶輸入
#include <iostream>// 函數聲明:窗口大小變化回調函數
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
// 函數聲明:處理輸入
void processInput(GLFWwindow* window);// 設置窗口寬高
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;int main()
{// 初始化 GLFW 庫,并配置 OpenGL 版本glfwInit(); // 初始化 GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);  // 要 OpenGL 3.xglfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  // 精確到 3.3 版本glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用現代核心功能,不兼容舊版#ifdef __APPLE__// 兼容 Mac OS 系統glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif// 創建 GLFW 窗口對象GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL) // 創建失敗則輸出錯誤信息并終止程序{std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window); // 將當前上下文設置為剛創建的窗口glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 注冊窗口尺寸改變的回調函數,告訴GLFW當窗口調整大小的時調用這個函數// 初始化 GLAD,加載所有 OpenGL 函數指針if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 渲染循環while (!glfwWindowShouldClose(window)) // 如果窗口沒有被關閉{// 處理輸入processInput(window);// 設置清屏顏色(RGBA格式,紅、綠、藍、透明度),用于清除顏色緩沖區glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 清除顏色緩沖區,使用上面設置的清屏顏色glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window); // 交換顏色緩沖區:把畫好的圖像展示到屏幕上glfwPollEvents();  // 從操作系統獲取事件(鍵盤、鼠標、窗口變化等),并更新 GLFW 內部狀態,或者觸發用戶注冊的回調函數。}// 釋放資源并退出glfwTerminate();return 0;
}// 處理輸入
void processInput(GLFWwindow* window)
{// 當按下 ESC 鍵時關閉窗口if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true); // 設置窗口應關閉標志
}// 窗口尺寸改變時調用的回調函數
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// 設置視口大小,使其匹配新窗口尺寸// 注意:在高 DPI 顯示屏上,實際像素尺寸可能比指定尺寸更大glViewport(0, 0, width, height);
}

顏色緩沖區

顏色緩沖區是幀緩沖區(Frame Buffer) 的一部分,它保存了當前窗口中每一個像素的顏色值。

當你在屏幕上繪制圖形時,你的所有繪制操作(畫三角形、貼紋理、光照等)其實都是先寫入顏色緩沖區,最后才一次性展示在屏幕上。

OpenGL 中的默認幀緩沖區包括:

緩沖區作用
顏色緩沖區(Color Buffer)存儲每個像素的顏色值(RGB 或 RGBA)。
深度緩沖區(Depth Buffer)存儲每個像素的深度值(Z 值),用于深度測試。
模板緩沖區(Stencil Buffer)用于進行復雜的遮罩、裁剪操作。

OpenGL 默認使用雙緩沖機制(Double Buffering),也就是有兩個顏色緩沖區:

緩沖區用途
前緩沖區(Front Buffer)當前正在顯示在屏幕上的圖像
后緩沖區(Back Buffer)當前正在繪制的圖像內容(你所有的渲染操作都寫在這里)

渲染流程大致如下:

  1. 你通過 OpenGL API 畫東西 → 寫入后緩沖區
  2. 繪制完成后,調用 glfwSwapBuffers(window); → 前后緩沖區交換
  3. 后緩沖區的圖像變成可見,前緩沖區變成新的繪制目標。

這樣就可以避免畫面撕裂或閃爍,保證畫面平滑流暢。

processInput()和glfwPollEvents()的關系

glfwPollEvents()processInput()
誰寫的GLFW 提供的函數你自己寫的函數
屬于哪一層系統層(事件驅動層)應用層(行為控制層)
作用從操作系統獲取輸入事件(鍵盤、鼠標、窗口)并更新內部狀態基于 GLFW 狀態判斷執行邏輯,比如關閉窗口、移動物體
必須調用嗎是的,否則無法接收到新輸入可選,但你不寫就不會響應用戶行為
通常調用順序一般在主循環每幀末尾調用一般在主循環每幀開始調用
是否處理輸入行為不處理輸入邏輯,只更新狀態你寫的行為處理代碼(比如 ESC 退出)就在這里

參考:
https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83953.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦閃屏可能的原因

1. 顯示器 / 屏幕故障 屏幕排線接觸不良&#xff1a;筆記本電腦屏幕排線&#xff08;屏線&#xff09;松動或磨損&#xff0c;導致信號傳輸不穩定&#xff0c;常見于頻繁開合屏幕的設備。屏幕面板損壞&#xff1a;液晶屏內部燈管老化、背光模塊故障或面板本身損壞&#xff0c;…

docker容器知識

一、docker與docker compose區別&#xff1a; 1、docker是創建和管理單個容器的工具&#xff0c;適合簡單的應用或服務&#xff1b; 2、docker compose是管理多容器應用的工具&#xff0c;適合復雜的、多服務的應用程序&#xff1b; 3、docker與docker compose對比&#xff…

什么是Rootfs

Rootfs (Root Filesystem) 詳解 buildroot工具構建了一個名為"rootfs.tar"的根文件系統壓縮包。 什么是rootfs Rootfs&#xff08;Root Filesystem&#xff0c;根文件系統&#xff09;是操作系統啟動后掛載的第一個文件系統&#xff0c;它包含系統正常運行所需的基…

關于NLP自然語言處理的簡單總結

參考&#xff1a; 什么是自然語言處理&#xff1f;看這篇文章就夠了&#xff01; - 知乎 (zhihu.com) 所謂自然語言理解&#xff0c;就是研究如何讓機器能夠理解我們人類的語言并給出一些回應。 自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…

Linux下載國外軟件鏡像的加速方法(以下載Python-3.8.0.tgz為例)

0 前言 使用linux經常會通過國外服務器下載軟件鏡像&#xff0c;有些軟件的下載速度奇慢&#xff0c;本文介紹一種加速國外軟件鏡像下載速度的方法&#xff0c;需要準備下載工具&#xff1a;迅雷。 1 以下載Python-3.8.0.tgz為例 找到Python官網的Python-3.8.0.tgz鏡像下載地…

沒有公網ip怎么端口映射外網訪問?使用內網穿透可以解決

無公網IP時本地搭建的網絡端口服務怎么映射外網遠程訪問&#xff1f;較為簡單通用的方案就是使用nat123內網穿透&#xff0c;下面詳細內網映射外網實現教程。? 一、了解內網公網區別&#xff0c;及無公網IP外網訪問方案 內網IP默認只能在同局域網內連接互通&#xff0c;而公…

Word2Vec詳解

目錄 Word2Vec 一、Word2Vec 模型架構 &#xff08;一&#xff09;Word2Vec 的核心理念 &#xff08;二&#xff09;Word2Vec 的兩種架構 &#xff08;三&#xff09;負采樣與層次 Softmax &#xff08;四&#xff09;Word2Vec 的優勢與局限 二、Word2Vec 預訓練及數據集…

ShardingSphere:查詢報錯:Actual table `數據源名稱.表名` is not in table rule configuration

目錄 簡介異常信息排查原因解決 簡介 1、使用ShardingSphere框架&#xff0c;版本為5.2.1 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.2.1</version>…

MongoDB聚合查詢:從入門到精通

文章目錄 前言一、工具一般聚合查詢分為四步 二、使用步驟1.MongoDB Compass2.Studio 3T 二、舉個栗子總結 前言 Mongo 聚合查詢 一般用mongo做數據庫,涉及到關聯查詢情況不多,但是還有些情況要使用到,今天就講下如何通過工具做關聯查詢,最終聚合結果,得到最終的查詢結果集; …

codeup添加流水線docker自動化部署

在項目根目錄下增加Dockerfile文件 # 使用基礎鏡像 FROM maven:3.8.4-openjdk-17-slim AS build # 設置工作目錄 WORKDIR /app # 復制項目源代碼 COPY . . # 構建項目 RUN mvn clean package -DskipTests # 驗證JAR包是否生成 RUN ls -l target/your-project.jar # 使用合適的…

從 Word2Vec 到 BERT:AI 不止是詞向量,更是語言理解

一、前言 在上篇文章中&#xff0c;我們介紹了Word2Vec以及它的作用&#xff0c;總的來說&#xff1a; Word2Vec是我們理解NLP的第一站 Word2Vec將詞變成了“向量”—— 終于可以用機器理解詞語的相似度 我們獲得了例如“國王 - 男人 女人 ≈ 女王” 的類比能力 我們可以將…

鏡像管理(2)Dockerfile總結

一、docker鏡像構建方法 commoit :使用 docker commit 意味著所有對鏡像的操作都是黑箱操作,生成的鏡像也被稱為黑 箱鏡像,換句話說,就是除了制作鏡像的人知道執行過什么命令、怎么生成的鏡像,別人根 本無從得知。而且,即使是這個制作鏡像的人,過一段時間后也無法記清具…

機器學習第十七講:PCA → 把100維數據壓縮成3D視圖仍保持主要特征

機器學習第十七講&#xff1a;PCA → 把100維數據壓縮成3D視圖仍保持主要特征 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指南 主…

【Linux庖丁解牛】——進程等待!

1. 進程退出場景 進程退出一般有三種場景&#xff1a; 。代碼運行完畢&#xff0c;結果正確 。代碼運行完畢&#xff0c;結果錯誤【比如&#xff0c;我們要對某個文件進行寫入&#xff0c;但寫入的文件路徑出錯&#xff0c;代碼運行完畢&#xff0c;可是結果出錯】 。代碼異…

鴻蒙OSUniApp 制作簡潔高效的標簽云組件#三方框架 #Uniapp

UniApp 制作簡潔高效的標簽云組件 在移動端應用中&#xff0c;標簽云&#xff08;Tag Cloud&#xff09;是一種常見的UI組件&#xff0c;它以視覺化的方式展示關鍵詞或分類&#xff0c;幫助用戶快速瀏覽和選擇感興趣的內容。本文將詳細講解如何在UniApp框架中實現一個簡潔高效的…

ubuntu14.04/16.06 安裝vscode(實測可以用)

地址&#xff1a;https://code.visualstudio.com/updates/v1_38 選擇deb 這個版本還支持ubuntu14.04和16.06 sudo dpkg -i code_1.38.1-1568209190_amd64.deb sudo apt-get install -f安裝成功&#xff0c;正常使用

WebRTC技術EasyRTC音視頻實時通話驅動智能攝像頭邁向多場景應用

一、方案背景? 在物聯網蓬勃發展的當下&#xff0c;智能攝像頭廣泛應用于安防、家居、工業等領域。但傳統智能攝像頭存在視頻傳輸延遲高、設備兼容性差、網絡波動時傳輸不穩定等問題&#xff0c;難以滿足用戶對實時流暢交互視頻的需求。EasyRTC憑借低延遲、高可靠、跨平臺特性…

Java EE進階1:導讀

1.發展歷程 2.學習內容 前?的課程中,學習的是Java基礎,JavaEE主要學習Java的應用,也就是學習Java在企業中是如何應用的 Java更多場景是業務開發,更狹義點可以理解為web開發.所以咱們的學習也是圍繞著如何使用Java來做web開發 2.1 什么是Web開發&#xff1f; web&#xff08…

APPtrace 智能參數系統:重構 App 用戶增長與運營邏輯

一、免填時代&#xff1a;APPtrace 顛覆傳統參數傳遞模式 傳統 App 依賴「邀請碼 / 手動綁定」實現用戶關聯&#xff0c;流程繁瑣導致 20%-30% 的用戶流失。APPtrace 通過 **「鏈接參數自動傳遞 安裝后智能識別」** 技術&#xff0c;讓用戶在無感知狀態下完成關系綁定、場景還…

bisheng系列(一)- 本地部署(Docker)

目錄 一、導讀 二、說明 1、鏡像說明 2、本節內容 三、docker部署 1、克隆代碼 2、運行鏡像 3、可能的錯誤信息 四、頁面測試 1、注冊用戶 2、登陸成功 3、添加模型 一、導讀 環境&#xff1a;Ubuntu 24.04、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景…