Qt 開發 OpenGL 程序流程

????????在用 Qt 開發 OpenGL 程序時,整體的工作流程分為幾個關鍵步驟,最終目的是將數據傳遞給 GPU 并開始渲染。這一過程涉及到從代碼編寫到與著色器連接的多個操作,下面我將詳細講解每個步驟。

1. 設置 Qt 項目

????????這個步驟是準備工作,你首先需要在 Qt 中創建一個 OpenGL 項目。通常你會選擇 QOpenGLWidget 來作為渲染的畫布。

????????a. 創建項目:在 Qt Creator 中創建一個基于 Qt Widgets 的項目,或者選擇 Qt Quick 項目(如果你使用 QML 進行圖形界面開發)。

????????b. 添加 OpenGL 支持:確保你的項目的 .pro 文件中包含了對 OpenGL 的支持:

QT += core gui opengl

2. 初始化 OpenGL 環境

????????在 Qt 中,QOpenGLWidget 提供了一個方便的接口來管理 OpenGL 的上下文和渲染操作。

????????在你創建的 Qt 應用中,重寫 QOpenGLWidget 的 initializeGL()、resizeGL() 和 paintGL() 方法來進行 OpenGL 的初始化、大小調整以及繪制。

示例:

class MyOpenGLWidget : public QOpenGLWidget {Q_OBJECTprotected:void initializeGL() override {// 初始化 OpenGL 設置initializeOpenGLFunctions();glEnable(GL_DEPTH_TEST);  // 開啟深度測試}void resizeGL(int w, int h) override {// 設置視口大小glViewport(0, 0, w, h);// 設置投影矩陣(比如透視投影)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 0.1, 100.0);glMatrixMode(GL_MODELVIEW);}void paintGL() override {// 清空屏幕并繪制glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();// 繪制場景代碼(如繪制一個三角形)}
};

3. 設置頂點數據

????????這一步是數據準備的過程。你要定義頂點數據以及紋理坐標,并將它們 發送到 GPU。

????????a. 使用頂點數組(vertices[])來存儲幾何數據(頂點位置)。

????????b.? 使用 glGenBuffers 和 glBindBuffer 來創建和綁定 VBO(頂點緩沖對象),然后將數據傳送到 GPU。

示例:

GLuint VBO, VAO;
GLfloat vertices[] = {// 頂點坐標,按順序排列-1.0f,  1.0f, 0.0f,-1.0f, -1.0f, 0.0f,1.0f, -1.0f, 0.0f,// ...
};// 創建 VAO(頂點數組對象)和 VBO(頂點緩沖對象)
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 設置頂點屬性(位置)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

4. 編寫著色器代碼

????????在 OpenGL 中,著色器負責計算每個像素、頂點的顏色和位置。你需要編寫頂點著色器(Vertex Shader)和片段著色器(Fragment Shader)。

????????頂點著色器:負責處理頂點數據(如位置、顏色等)。

????????片段著色器:負責計算每個像素的最終顏色。

????????著色器代碼一般是用 GLSL 語言編寫的。

頂點著色器 (vertex_shader.glsl):

#version 330 core
layout(location = 0) in vec3 position;
void main() {gl_Position = vec4(position, 1.0);
}

片段著色器 (fragment_shader.glsl):

#version 330 core
out vec4 color;
void main() {color = vec4(1.0, 0.0, 0.0, 1.0);  // 渲染紅色
}

5. 編譯和鏈接著色器

????????將編寫的著色器代碼加載到 OpenGL 中并編譯成程序:

????????a. 使用 glShaderSource() 將著色器代碼傳遞給 OpenGL。

????????b. 使用 glCompileShader() 編譯每個著色器。

????????c. 使用 glCreateProgram() 和 glAttachShader() 將編譯后的著色器附加到程序中。

????????d. 使用 glLinkProgram() 鏈接著色器程序。

示例代碼:

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
glCompileShader(vertexShader);GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);
glCompileShader(fragmentShader);GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);

6. 繪制場景

????????在 paintGL() 中,你可以開始繪制使用這些著色器的物體。

????????綁定相應的 VAO,并通過 glDrawArrays() 或 glDrawElements() 調用進行繪制。

示例:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);  // 繪制三角形
glBindVertexArray(0);

7. 調試和優化

????????確保所有的 OpenGL 調用都正確無誤,并且著色器沒有編譯錯誤。

????????使用 OpenGL 的調試工具(如 glGetError())或圖形調試工具(如 RenderDoc)來幫助調試渲染過程。

8. 與 GPU 開始繪制

????????完成上述步驟后,OpenGL 會開始將數據上傳到 GPU,并且 GPU 會根據著色器程序繪制結果。你可以看到渲染結果并根據需要進行交互式的更新。


總結流程:

  1. 創建 Qt 項目并啟用 OpenGL 支持。
  2. 繼承 QOpenGLWidget 并實現 initializeGL()、resizeGL() 和 paintGL()。
  3. 設置并傳遞頂點數據到 GPU。
  4. 編寫頂點著色器和片段著色器。
  5. 編譯和鏈接著色器。
  6. 使用著色器并開始繪制。

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

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

相關文章

長短期記憶網絡(LSTM)學習指南

長短期記憶網絡(LSTM)學習指南 1. 定義和背景 長短期記憶網絡(Long Short-Term Memory, LSTM)是一種遞歸神經網絡(RNN)的變體,旨在解決傳統RNN在處理長期依賴關系時遇到的梯度消失或爆炸問題。…

仿12306項目(4)

基本預定車票功能的開發 對于乘客購票來說,需要有每一個車次的余票信息,展示給乘客,供乘客選擇,因此首個功能是余票的初始化,之后是余票查詢,這兩個都是控臺端。對于會員端的購票,需要有余票查詢…

第十二屆藍橋杯 異或數列

原題: https://www.acwing.com/problem/content/3424/ 題目大意: A、B兩人的數初始值均為0,他們輪流從X數組中取數,可以將該數與自己的數或對方的數進行異或操作,A先手,當X中的數被取完的時候誰的數大誰…

微服務的認識與拆分

微服務架構通過將應用分解為一組小的、獨立的服務來實現,每個服務圍繞特定業務功能構建,并能獨立部署與擴展。這種架構增強了開發靈活性、提高了系統的可維護性和擴展性,使得團隊可以更快地響應變化和市場需求。 目錄 認識微服務 單體架構 …

高效編程指南:PyCharm與DeepSeek的完美結合

DeepSeek接入Pycharm 前幾天DeepSeek的充值窗口又悄悄的開放了,這也就意味著我們又可以絲滑的使用DeepSeek的API進行各種輔助性工作了。本文我們來聊聊如何在代碼編輯器中使用DeepSeek自動生成代碼。 注:本文適用于所有的JetBrains開發工具&#xff0c…

項目中同時使用Redis(lettuce)和Redisson的報錯

溫馨提示:圖片有點小,可以放大頁面進行查看... 問題1:版本沖突 直接上圖,這個錯表示依賴版本不匹配問題,我本地SpringBoot用的是2.7,但是Redisson版本用的3.32.5。 我們通過點擊 artifactId跟進去 發現它…

Jackson 詳解

目錄 前言 Jackson 是 Java 生態中最流行的 JSON 處理庫之一,廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能,支持注解、模塊化設計和多種數據格式(如 XML、YAML)。本文將詳細介…

H.264,H.265,H.266標準技術改進

關于H.264,H.265,H.266相關資料鏈接: 標準及中文資料鏈接 視頻編碼中的主要技術 視頻編碼的目標是在保證視頻質量的前提下,盡可能減少數據量。以下是視頻編碼中的核心技術: 塊劃分(Block Partitioning) 將視頻幀劃分…

clickhouse安裝路徑

《ClickHouse安裝路徑指南》 大家好,今天我們將一起學習如何在電腦上找到和理解ClickHouse的安裝路徑。這將幫助學生、科研人員以及任何對數據庫技術感興趣的人更好地管理他們的數據查詢工作。 ClickHouse是一款列式存儲數據庫管理系統(DBMS&#xff09…

時序數據庫 InfluxDB 3.0 版本性能實測報告:寫入吞吐量提升效果驗證

亮點總結: TSBS 測試表明,對于少于 100 萬臺設備的數據集,InfluxDB OSS 3.0 的數據寫入速度實際上比 InfluxDB OSS 1.8 更慢。 對于 100 萬臺及以上設備的數據集,InfluxDB OSS 3.0 的數據寫入性能才開始超過 InfluxDB OSS 1.8。…

AS32X601雙核鎖步MCU技術優勢分析

AS32X601是國科安芯公司研制的一系列基于32位RISC-V指令集車規級MCU處理器芯片。主頻高達180MHz,支持雙核鎖步架構,基于軟錯誤防護技術加持,顯著提高芯片安全性能。產品具有高安全、低失效、多IO、低成本、抗輻照等特點。 一、功能安全與可靠…

基于 LeNet 網絡的 MNIST 數據集圖像分類

1.LeNet的原始實驗數據集MNIST 名稱:MNIST手寫數字數據集 數據類型:灰度圖 (一通道) 圖像大小:28*28 類別數:10類(數字0-9) 1.通過torchvision.datasets.MNIST下載并保存到本地…

電池綜合測試儀:科技賦能,精準守護能源安全

在當今這個科技日新月異的時代,電池作為眾多電子設備的心臟,其性能的穩定與高效直接關系到設備的運行質量與使用安全。隨著電動汽車、可穿戴設備、儲能系統等領域的快速發展,對電池性能的檢測與評估提出了更高要求。在此背景下,電…

【Linux 22.4 ubuntu 安裝cuda12.1 完整方案】

下載cuda12.1 官網網址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已經安裝驅動,則不要選擇dirver那項 添加環境變量 vim ~/.b…

實戰案例分享:Android WLAN Hal層移植(MTK+QCA6696)

本文將詳細介紹基于MTK平臺,適配高通(Qualcomm)QCA6696芯片的Android WLAN HAL層的移植過程,包括HIDL接口定義、Wi-Fi驅動移植以及wpa_supplicant適配過程,涵蓋STA與AP模式的常見問題與解決方法。 1. HIDL接口簡介 HID…

Greenplum6.19集群搭建

一,安裝說明 1.1環境說明 1、首先確定部署的環境,確定下服務器的端口,一般默認是22的端口; 2、當前這份文檔是服務器處于10022端口下部署的(現場生產環境要求,22端口在生產環境存在安全隱患)&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下,可能會有一些人會惡意訪問當前網站,來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂,出現臟數據,或者造成后端訪問壓力大等問題。 一般要解決這個問題的話,前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp調用的接口,新建類文件繼承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 ,用戶狀態為運行 2: 創建新用戶 命令: adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…