Horse3D游戲引擎研發筆記(五):在QtOpenGL環境下,仿three.js的BufferGeometry管理VAO和EBO繪制四邊形

一、背景介紹

在三維圖形渲染中,幾何形狀的管理是引擎的核心功能之一。Three.js通過BufferGeometry接口實現了對頂點數據和索引數據的高效管理,而OpenGL則通過頂點數組對象(VAO)和元素數組對象(EBO)來實現類似的功能。本篇筆記將詳細介紹如何在QtOpenGL環境下,仿照Three.js的BufferGeometry接口,實現對VAO和EBO的管理,并通過這些技術繪制一個四邊形。

在開始之前,我們可以參考深入理解Three.js中的BufferGeometry,了解Three.js中BufferGeometry的核心設計理念和實現原理。這將幫助我們更好地理解如何在QtOpenGL環境下實現類似的功能。

二、核心實現

1. IGeometry接口設計

為了實現對幾何形狀的統一管理,我們設計了一個IGeometry接口。該接口定義了創建和管理幾何形狀渲染狀態的方法,具體包括:

  • useGeometry(IScreen* screen):用于綁定幾何形狀的OpenGL狀態。
  • createOpenGLState(IScreen* screen):用于創建幾何形狀的OpenGL狀態。
  • createIndicesAttribute():用于創建幾何形狀的索引屬性。
  • createBufferAttributes():用于創建幾何形狀的頂點屬性列表。

通過該接口,我們可以實現對不同幾何形狀的統一管理。

提示:關于頂點屬性的定義和管理,可以參考基于QtOpenGL使用仿Three.js的BufferAttribute結構重構三角形繪制,了解如何通過BufferAttribute實現頂點數據的高效管理。

2. Quadrangle類實現

Quadrangle類實現了IGeometry接口,表示一個四邊形的幾何形狀。該類通過頂點坐標和索引數據實現了對四邊形的渲染。

頂點屬性定義

Quadrangle類中,我們定義了四邊形的頂點坐標:

std::list<BufferAttribute*> Quadrangle::createBufferAttributes()
{return {new BufferAttribute({-0.5f, 0.5f, 0.0f,  -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f,  			0.5f, 0.5f, 0.0f }, 0, 3)};
}

索引屬性定義

四邊形由兩個三角形組成,因此我們定義了兩個三角形的索引數據:

IndicesAttribute* Quadrangle::createIndicesAttribute()
{return new IndicesAttribute({0, 1, 3, // 第一個三角形1, 2, 3  // 第二個三角形 });
}

OpenGL狀態創建

createOpenGLState方法中,我們創建了頂點數組對象(VAO)和元素數組對象(EBO),并將頂點屬性和索引屬性綁定到這些對象上:

void IGeometry::createOpenGLState(IScreen* screen)
{// 創建并綁定頂點數組對象screen->glGenVertexArrays(1, &m_vao);screen->glBindVertexArray(m_vao);m_bufferAttributes = createBufferAttributes();for (BufferAttribute* bufferAttribute : m_bufferAttributes){bufferAttribute->createOpenGLState(screen);}m_indicesAttribute = createIndicesAttribute();m_indicesAttribute->createOpenGLState(screen);
}

3. 渲染實現

FerghanaScreen類中,我們實現了對四邊形的渲染邏輯。

初始化OpenGL狀態

initializeGL方法中,我們初始化了OpenGL函數,并創建了四邊形的OpenGL狀態:

void FerghanaScreen::initializeGL()
{initializeOpenGLFunctions();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);quadrangle->createOpenGLState(this);// 初始化著色器程序shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, R"(#version 450 corelayout (location = 0) in vec3 aPos;void main(){gl_Position = vec4(aPos, 1.0);})");shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, R"(#version 450 coreout vec4 FragColor;void main(){FragColor = vec4(1.0, 0.5, 0.0, 1.0); // 橙色})");shaderProgram->link();
}

繪制四邊形

paintGL方法中,我們實現了對四邊形的繪制邏輯:

void FerghanaScreen::paintGL()
{glClear(GL_COLOR_BUFFER_BIT);shaderProgram->bind();// 綁定頂點數組對象quadrangle->useGeometry(this);// 繪制glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);shaderProgram->release();
}

提示:關于Shader編程的實現,可以參考使用QtOpenGL的Shader編程繪制彩色三角形,了解如何通過頂點著色器和片段著色器實現更復雜的渲染效果。

三、測試與驗證

通過上述實現,我們成功地在QtOpenGL環境下,仿照Three.js的BufferGeometry接口,實現了對四邊形的渲染。運行程序后,我們可以在窗口中看到一個橙色的四邊形。

四、項目介紹

Horse渲染內核基于Qt與OpenGL開發,是一款三維引擎。本項目將不提供編輯器,以SDK的形式對外提供接口。 本項目將參考Three.js與Unity等眾多渲染引擎的API設計。致力于開發出一款具有競爭力的渲染引擎內核。

地址:

  • Gitee
  • GitHub

五、總結與展望

本篇筆記詳細介紹了如何在QtOpenGL環境下,仿照Three.js的BufferGeometry接口,實現對VAO和EBO的管理,并通過這些技術繪制一個四邊形。通過這種方式,我們可以實現對復雜幾何形狀的高效管理,為后續的引擎開發打下堅實的基礎。

未來,我們計劃繼續完善Horse3D引擎的功能,包括支持更多的幾何形狀、實現更復雜的渲染效果等。關于后續的開發計劃,可以參考在QtOpenGL下仿three.js,封裝EBO繪制四邊形,了解如何通過封裝EBO實現更高效的幾何形狀渲染。

通過不斷的學習和實踐,我們相信Horse3D引擎將能夠支持更多復雜的三維渲染功能,為開發者提供一個強大而靈活的渲染引擎內核。

Horse3D游戲引擎研發筆記(一):從使用Qt的OpenGL庫繪制三角形開始
Horse3D游戲引擎研發筆記(二):基于QtOpenGL使用仿Three.js的BufferAttribute結構重構三角形繪制
Horse3D游戲引擎研發筆記(三):使用QtOpenGL的Shader編程繪制彩色三角形
Horse3D游戲引擎研發筆記(四):在QtOpenGL下仿three.js,封裝EBO繪制四邊形
Horse3D游戲引擎研發筆記(五):在QtOpenGL環境下,仿three.js的BufferGeometry管理VAO和EBO繪制四邊形
Horse3D游戲引擎研發筆記(六):在QtOpenGL環境下,仿Unity的材質管理Shader繪制四邊形

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

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

相關文章

Ping32 與 IP-GUARD 深度對比:Ping32,引領企業數據安全新方向

在數字化時代&#xff0c;企業數據宛如珍貴的寶藏&#xff0c;是推動業務發展、保持競爭優勢的核心資產。但與此同時&#xff0c;數據安全威脅也如影隨形&#xff0c;內部員工的誤操作、惡意竊取&#xff0c;外部黑客的攻擊&#xff0c;都可能讓企業數據面臨泄露風險&#xff0…

洛谷 P2842 紙幣問題 1 -普及-

題目描述 某國有 nnn 種紙幣&#xff0c;每種紙幣面額為 aia_iai? 并且有無限張&#xff0c;現在要湊出 www 的金額&#xff0c;試問最少用多少張紙幣可以湊出來&#xff1f; 輸入格式 第一行兩個整數 n,wn,wn,w&#xff0c;分別表示紙幣的種數和要湊出的金額。 第二行一行 nn…

第十四節:物理引擎集成:Cannon.js入門

第十四節&#xff1a;物理引擎集成&#xff1a;Cannon.js入門 引言 物理引擎為3D世界注入真實感&#xff0c;讓物體遵循重力、碰撞和動量等物理規律。Cannon.js是Three.js生態中最強大的物理引擎之一&#xff0c;本文將深入解析其核心機制&#xff0c;并通過Vue3實現物理沙盒系…

二十四、Mybatis-基礎操作-刪除(預編譯SQL)

mybatis環境準備概述與注意事項&#xff08;springboot項目引入三項必要的起步依賴&#xff09;項目目錄結構mybatis基礎操作-刪除對應EmpMapper&#xff08;接口&#xff09;代碼 package com.itheima.mapper;import org.apache.ibatis.annotations.*;Mapper public interface…

JavaScript 核心基礎:類型檢測、DOM 操作與事件處理

JavaScript 作為松散類型語言&#xff0c;掌握類型檢測規則、DOM 元素獲取方式及事件處理邏輯&#xff0c;是寫出健壯代碼的基礎。本文系統梳理 JS 高頻基礎知識點&#xff0c;結合實戰場景解析原理與用法&#xff0c;幫你建立清晰的知識框架。 一、JS 數據類型與類型檢測&…

軟件開發過程中的維護活動

軟件開發過程中的維護活動軟件維護是軟件生命周期中持續時間最長、成本最高的階段&#xff0c;它并非簡單的“修理”&#xff0c;而是一系列旨在延長軟件生命周期、保持其價值和適應性的工程化活動。研究表明&#xff0c;軟件維護成本可占總成本的60%以上。理解并有效管理維護活…

STC8單片機驅動I2C屏幕:實現時間、日期與溫濕度顯示

STC8 單片機驅動 I2C 屏幕&#xff1a;實現時間、日期與溫濕度顯示 在單片機項目中&#xff0c;“數據可視化” 是核心需求之一 —— 將時間、溫濕度等關鍵信息實時顯示在屏幕上&#xff0c;能讓項目更具實用性。本文以STC8 系列單片機為核心&#xff0c;搭配 I2C 接口的 OLED…

基于SpringBoot+Vue的智能消費記賬系統(AI問答、WebSocket即時通訊、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;AI問答、WebSocket即時通訊、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&#xff1a; 技術…

[論文筆記] WiscKey: Separating Keys from Values in SSD-Conscious Storage

閱讀 WiscKey 論文時隨手記錄一些筆記。 這篇論文的核心思想理解起來還是很簡單的&#xff0c;但是具體涉及到實現還有一些想不明白的地方&#xff0c;后來看到 TiKV 的 Titan 實現也很有趣&#xff0c;索性把這些問題都記錄下來并拋出來。 本文中和論文相關的內容&#xff0…

week1-[循環嵌套]畫正方形

week1-[循環嵌套]畫正方形 題目描述 輸入一個正整數 nnn&#xff0c;請使用數字 000 到 999 拼成一個這樣的正方形圖案&#xff08;參考樣例輸入輸出&#xff09;&#xff1a;由上至下、由左至右依次由數字 000 到 999 填充。每次使用數字 999 填充后&#xff0c;將從頭使用數字…

在 Vue2 中使用 pdf.js + pdf-lib 實現 PDF 預覽、手寫簽名、文字批注與高保真導出

本文演示如何在前端&#xff08;Vue.js&#xff09;中結合 pdf.js、pdf-lib 與 Canvas 技術實現 PDF 預覽、圖片簽名、手寫批注、文字標注&#xff0c;并導出高保真 PDF。 先上demo截圖&#xff0c;后續會附上代碼倉庫地址&#xff08;目前還有部分問題暫未進行優化&#xff0…

tomcat 定時重啟

tomcat 定時重啟 定時重啟的目的是:修復內存泄漏等問題,tomcat 長時間未重啟,導致頁面卡頓,卡死,無法訪問,影響用戶訪問 1.編寫腳本 su - tomcat [tomcat@u1abomap02 ~]$ ls restart_tomcat_gosi.sh tomcat_gosi.log vi restart_tomcat_gosi.sh #!/bin/bash# 定義日志目…

WinForm 簡單用戶登錄記錄器實現教程

目錄 功能概述 實現思路 一、程序入口&#xff08;Program.cs&#xff09; 二、登錄用戶控件&#xff08;Login.cs&#xff09; 2.1 控件初始化與密碼顯示邏輯 2.2 登錄控件設計器&#xff08;Login.Designer.cs&#xff09; 三、主窗體&#xff08;Form1.cs&#xff09…

docker 安裝 使用

Docker安裝 一鍵安裝命令 sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun啟動docker sudo service docker startpull鏡像加速配置 sudo vi /etc/docker/daemon.json輸入下列內容&#xff0c;最后按ESC&#xff0c;輸入 :wq! 保存退出。 {"regis…

無人機探測器技術解析

一、工作模式 無人機探測器通過多模式協同實現全流程防御閉環&#xff1a; 1. 主動掃描模式 雷達主動探測&#xff1a;發射電磁波&#xff08;如Ka/Ku波段&#xff09;&#xff0c;通過回波時差與多普勒頻移計算目標距離、速度及航向&#xff0c;適用于廣域掃描&#xff08;…

Linux學習-軟件編程(進程與線程)

進程回收wait原型&#xff1a;pid_t wait(int *wstatus); 功能&#xff1a;回收子進程空間 參數&#xff1a;wstatus&#xff1a;存放子進程結束狀態空間的首地址 返回值&#xff1a;成功返回回收到的子進程的PID失敗返回-1WIFEXITED(wstatus)&#xff1a;測試進程是否正常結束…

大模型微調分布式訓練-大模型壓縮訓練(知識蒸餾)-大模型推理部署(分布式推理與量化部署)-大模型評估測試(OpenCompass)

大模型微調分布式訓練 LLama Factory與Xtuner分布式微調大模型 大模型分布式微調訓練的基本概念 為什么需要分布式訓練&#xff1f; 模型規模爆炸&#xff1a;現代大模型&#xff08;如GPT-3、LLaMA等&#xff09;參數量達千億級別&#xff0c;單卡GPU無法存儲完整模型。 …

物聯網、大數據與云計算持續發展,樓宇自控系統應用日益廣泛

在深圳某智慧園區的控制中心&#xff0c;管理人員通過云端平臺實時監控著5公里外園區內每臺空調的運行參數、每盞路燈的開關狀態和每個區域的能耗數據。當系統檢測到某棟樓宇的電梯運行振動異常時&#xff0c;大數據算法自動預判可能的故障點并推送維修建議&#xff1b;物聯網傳…

在實驗室連接地下車庫工控機及其數據采集設備

在實驗室連接地下車庫工控機及其數據采集設備 我們小組為項目的數據采集組&#xff0c;目前在車頂集成了一個工控機、兩個激光雷達、兩個攝像頭、一個戶外電源 由于地下車庫蚊子太多了&#xff0c;我們可受不了這個苦&#xff0c;所以想坐在實驗室吹著空調就能連接工控機來修改…

icmpsh、PingTunnel--安裝、使用

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…