一、背景介绍

在三维图形渲染中,几何形状的管理是引擎的核心功能之一。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;作者及发布平台不承担任何责任。渗透测试涉及复杂技…