当前位置: 首页 > news >正文

公司入口网站app中山东莞网站推广

公司入口网站app,中山东莞网站推广,外网专线,西安建设银行网站在上一篇笔记中#xff0c;我们已经实现了基于QtOpenGL的BufferGeometry管理VAO和EBO绘制四边形的功能。这一次#xff0c;我们将深入探讨材质管理系统的实现#xff0c;包括Shader的加载与编译、材质的创建与使用#xff0c;以及如何通过材质系统绘制带有自定义Shader效果…在上一篇笔记中我们已经实现了基于QtOpenGL的BufferGeometry管理VAO和EBO绘制四边形的功能。这一次我们将深入探讨材质管理系统的实现包括Shader的加载与编译、材质的创建与使用以及如何通过材质系统绘制带有自定义Shader效果的四边形。 一、Horse3D引擎的材质管理系统 在现代三维引擎中材质管理系统是渲染系统的核心模块之一。它负责管理模型表面的视觉效果包括颜色、纹理、光照响应等。在Horse3D引擎中我们参考了Unity和Three.js的材质系统设计实现了以下功能 材质的定义与加载通过JSON格式的材质文件定义材质属性包括顶点着色器、片段着色器、纹理资源等。Shader的编译与管理支持 Shader 的动态加载与编译通过Builder模式管理Shader程序的创建与缓存。材质的实例化与使用通过Material类管理材质的OpenGL状态并提供统一的接口绑定材质进行渲染。 二、关键技术与实现细节 1. 材质文件的定义 在Horse3D中材质通过JSON文件进行定义。以下是一个典型的材质文件示例 {Attributes: [{Name: a_position,Dimension: 3},{Name: a_texcoord,Dimension: 2}],Uniforms: [{Name: u_fragColor,Type: Color,Value: #FFFF00},{Name: u_texture_fei,Type: Texture2D,Value: Materials/Test/fei.jpg},{Name: u_texture_tang,Type: Texture2D,Value: Materials/Test/tang.jpeg}],Shaders: [{ShaderEnum: Vertex,SourceFile: Materials/Test/Test.vert},{ShaderEnum: Fragment,SourceFile: Materials/Test/Test.frag}] }该文件定义了材质的顶点属性、Uniform变量以及Shader程序。通过这种方式我们可以灵活地配置材质的视觉效果。这一部分的设计灵感来源于Unity与OpenGL中的材质系统详解。 2. Shader程序的加载与编译 在Horse3D中Shader程序的加载与编译通过MaterialBuilder类实现。该类采用Builder模式负责解析材质文件、加载Shader代码、编译Shader程序并缓存编译结果。 Shader代码的解析与加载 在MaterialBuilder类中getShaderProgramCode方法负责从材质文件中提取Shader代码。通过解析Shaders数组我们可以获取顶点着色器和片段着色器的源代码路径并将其加载到内存中。 std::mapQOpenGLShader::ShaderTypeBit, QString MaterialBuilder::getShaderProgramCode(const QJsonValue shadersValue) {static std::mapQString, QOpenGLShader::ShaderTypeBit shaderTypeMap {{ Vertex, QOpenGLShader::Vertex },{ Fragment, QOpenGLShader::Fragment }};std::mapQOpenGLShader::ShaderTypeBit, QString shaderProgramCode;for (const QJsonValue shaderValue : shadersValue.toArray()){const QJsonObject shaderObject shaderValue.toObject();QOpenGLShader::ShaderTypeBit shaderType shaderTypeMap[shaderObject[ShaderEnum].toString()];QString sourcePath QHutu::applicationDirPath(shaderObject[SourceFile].toString());shaderProgramCode.insert(std::pairQOpenGLShader::ShaderTypeBit, QString(shaderType, QHutu::readTextFile(sourcePath)));}return shaderProgramCode; }Shader程序的编译与链接 在createShaderProgram方法中我们通过QOpenGLShaderProgram类编译和链接Shader程序。具体步骤如下 创建顶点着色器和片段着色器对象。加载并编译Shader源代码。将编译后的Shader添加到Shader程序中。链接Shader程序并验证其有效性。 QOpenGLShaderProgram* MaterialBuilder::createShaderProgram(const QString key) {std::mapQString, QOpenGLShaderProgram*::iterator iter m_shaderPrograms.find(key);if (iter ! m_shaderPrograms.end()){return iter-second;}std::mapQString, std::mapQOpenGLShader::ShaderTypeBit, QString::iterator iterator m_shaderProgramCodes.find(key);if (iterator m_shaderProgramCodes.end()){return nullptr;}QOpenGLShaderProgram* shaderProgram new QOpenGLShaderProgram();std::mapQOpenGLShader::ShaderTypeBit, QString shaderProgramCode iterator-second;for (std::pairQOpenGLShader::ShaderTypeBit, QString shaderCode : shaderProgramCode){QOpenGLShader* shader new QOpenGLShader(shaderCode.first);shader-compileSourceCode(shaderCode.second);shaderProgram-addShader(shader);}bool result shaderProgram-link() shaderProgram-bind();if (result){m_shaderPrograms.insert(std::pairQString, QOpenGLShaderProgram*(key, shaderProgram));}else{return nullptr;}return shaderProgram; }通过这种方式我们可以动态地创建和管理多个Shader程序。这一部分的实现参考了深入理解OpenGL Shader与GLSL基础知识与优势分析。 3. 材质的创建与使用 在Material类中我们封装了材质的OpenGL状态管理功能。通过createOpenGLState方法我们可以为当前材质创建OpenGL状态如绑定Shader程序。通过useMaterial方法我们可以绑定当前材质并进行渲染。 void Material::createOpenGLState(IScreen* screen) {m_shaderProgram MaterialBuilder::materialBuilder()-createShaderProgram(m_key); }bool Material::useMaterial() {if (m_shaderProgram nullptr){return false;}m_shaderProgram-bind();return true; }三、绘制四边形的实现 在Horse3D中绘制四边形的过程可以分为以下几个步骤 1. 初始化材质与几何体 在FerghanaScreen类的构造函数中我们创建了材质和四边形对象 Material* material; Quadrangle* quadrangle;FerghanaScreen::FerghanaScreen(QWidget* parent): IScreen(parent) {quadrangle new Quadrangle();material createMaterial(Materials/Test/Test.material); }2. 创建OpenGL状态 在initializeGL方法中我们初始化OpenGL环境并为材质和几何体创建OpenGL状态 void FerghanaScreen::initializeGL() {initializeOpenGLFunctions();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);quadrangle-createOpenGLState(this);material-createOpenGLState(this); }3. 渲染四边形 在paintGL方法中我们绑定材质并绘制四边形 void FerghanaScreen::paintGL() {glClear(GL_COLOR_BUFFER_BIT);material-useMaterial();quadrangle-useGeometry(this);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); }这一部分的实现参考了之前的开发笔记在QtOpenGL环境下仿three.js的BufferGeometry管理VAO和EBO绘制四边形。 四、结果与分析 通过上述实现我们可以在QtOpenGL环境下成功绘制带有自定义Shader效果的四边形。以下是本次实现的关键点总结 材质管理系统的实现通过Material类和MaterialBuilder类我们实现了材质的动态加载与管理支持Shader程序的编译与缓存。Shader程序的动态加载通过解析JSON格式的材质文件我们实现了Shader程序的动态加载与编译支持灵活的Shader配置。四边形的绘制通过结合材质系统和几何体管理模块我们实现了带有自定义Shader效果的四边形的绘制。 五、项目介绍 Horse渲染内核基于Qt与OpenGL开发是一款三维引擎。本项目将不提供编辑器以SDK的形式对外提供接口。本项目将参考Three.js与Unity等众多渲染引擎的API设计致力于开发出一款具有竞争力的渲染引擎内核。 地址 GiteeGitHub 六、总结与展望 在本次开发中我们成功实现了Horse3D引擎的材质管理系统并通过该系统绘制了带有自定义Shader效果的四边形。这为后续的三维模型渲染奠定了基础。 未来我们计划在以下方面进一步完善材质管理系统 支持更多的Shader类型如几何着色器、曲面细分着色器等。优化Shader程序的缓存机制通过更高效的缓存策略减少Shader编译的开销。支持更多的材质属性如光照模型、反射模型等。 通过不断优化和扩展我们希望将Horse3D引擎打造成为一款具有竞争力的三维渲染引擎内核。 七、参考文献 深入理解OpenGL Shader与GLSL基础知识与优势分析 https://blog.csdn.net/2503_92624912/article/details/150076191 Unity与OpenGL中的材质系统详解 https://blog.csdn.net/2503_92624912/article/details/150432587 Three.js 材质系统深度解析 https://blog.csdn.net/2503_92624912/article/details/150448417 应用Builder模式在C中进行复杂对象构建 https://blog.csdn.net/2503_92624912/article/details/149831961 Horse3D游戏引擎研发笔记一从使用Qt的OpenGL库绘制三角形开始 https://blog.csdn.net/2503_92624912/article/details/150006641 Horse3D游戏引擎研发笔记二基于QtOpenGL使用仿Three.js的BufferAttribute结构重构三角形绘制 https://blog.csdn.net/2503_92624912/article/details/150063706 Horse3D游戏引擎研发笔记三使用QtOpenGL的Shader编程绘制彩色三角形 https://blog.csdn.net/2503_92624912/article/details/150114327 Horse3D游戏引擎研发笔记四在QtOpenGL下仿three.js封装EBO绘制四边形 https://blog.csdn.net/2503_92624912/article/details/150235885 Horse3D游戏引擎研发笔记五在QtOpenGL环境下仿three.js的BufferGeometry管理VAO和EBO绘制四边形 https://blog.csdn.net/2503_92624912/article/details/150400945 Horse3D游戏引擎研发笔记七在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形 相较于Unity、Unreal Engine与Godot引擎 Pomian语言处理器 研发笔记一使用C的正则表达式构建词法分析器
http://www.pierceye.com/news/67836/

相关文章:

  • 门户网站设计特点园林景观设计公司成都
  • 做问卷的网站生成二维码做资讯网站需要什么条件
  • 西安网站建设陕icp学校网站建设策划
  • wordpress站做app艺术设计教学资源网站建设标准
  • 建网站需要多大的宽带html5做网站的总结
  • 威海外贸网站建设怎么样wordpress把头像改为QQ头像
  • 网站站点的建立会员卡管理系统怎么制作
  • 留学生做留服证明在哪个网站软文范例200字
  • 企业被网站骗做会员南宁网站制作多少钱
  • 网站排名 算法网易企业邮箱申请注册
  • 网站常用字体大小影楼修图
  • 金融网站建设公司排名松江叶榭网站建设
  • 罗湖做网站联系电话网站优化+山东
  • 网站建设要什么营销传播的服务商
  • 自贡制作网站wordpress git page
  • 五指山住房建设局网站包头网站制作公司
  • 合肥专业网站制作团队网站制作报价优惠
  • 河南高端网站建设公司网站建设 服务流程
  • 马鞍山网站制作公司中国电子商务网站建设
  • 佛山免费建站怎样百度百度一下你就知道主页
  • 广州建站优化公司网站页面模板页面布局
  • 商城购物网站设计内容网站微信认证费用多少钱
  • 怎样建设网站最好上海公司章程在哪里下载
  • 厦门哪家做网站好网站建设三网合一指的是什么
  • 2023免费网站推广免费一键生成个人网站
  • wordpress站点实例网站关键词优化公司
  • vue可以做pc的网站广州哪家做网站好
  • 专门制作网站建网站的流程和费用
  • 网站推广的方法有哪些?最基础的编程代码
  • php做的卖水果网站网站友链查询