热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ogrenext学习笔记Day7

ogre-next学习笔记-Day7通过之前的分析,知晓hlms的重要性。对hlms做一个详细的分析hlms文件结构以及对象从图中看出,hlms的文
ogre-next 学习笔记 - Day 7

通过之前的分析,知晓 hlms 的重要性。对hlms做一个详细的分析

hlms文件结构以及对象

hlms核心文件结构以及对象关系图

从图中看出,hlms的文件不多,对象也不多,关系简单。

类图

能看懂就行,不求格式
类图
对象大概能分为几类

  • Hlms
  • HlmsProperty
  • HlmsDatablock
  • StaticBlock
  • HlmsJson
  • 其他

每一种 hlms都有一个对应的property,这些property由一些const idString 标识它支持的属性。
例如

struct _OgreHlmsUnlitMobileExport UnlitMobileProp{static const IdString TexMatrixCount;static const IdString TexMatrixCount0;static const IdString TexMatrixCount1;static const IdString TexMatrixCount2;static const IdString TexMatrixCount3;static const IdString TexMatrixCount4;static const IdString TexMatrixCount5;static const IdString TexMatrixCount6;static const IdString TexMatrixCount7;// ...}const IdString UnlitMobileProp::TexMatrixCount = IdString( "hlms_texture_matrix_count" );const IdString UnlitMobileProp::TexMatrixCount0 = IdString( "hlms_texture_matrix_count0" );const IdString UnlitMobileProp::TexMatrixCount1 = IdString( "hlms_texture_matrix_count1" );const IdString UnlitMobileProp::TexMatrixCount2 = IdString( "hlms_texture_matrix_count2" );const IdString UnlitMobileProp::TexMatrixCount3 = IdString( "hlms_texture_matrix_count3" );const IdString UnlitMobileProp::TexMatrixCount4 = IdString( "hlms_texture_matrix_count4" );const IdString UnlitMobileProp::TexMatrixCount5 = IdString( "hlms_texture_matrix_count5" );const IdString UnlitMobileProp::TexMatrixCount6 = IdString( "hlms_texture_matrix_count6" );const IdString UnlitMobileProp::TexMatrixCount7 = IdString( "hlms_texture_matrix_count7" );

每个hlms 都有一个 datablock
例如

class HlmsUnlitMobileDatablock : public HlmsDatablock
{/** Valid parameters in params:&#64;param params* diffuse [r g b [a]]If absent, the values of mR, mG, mB & mA will be ignored by the pixel shader.When present, the rgba values can be specified.Default: AbsentDefault (when present): diffuse 1 1 1 1* diffuse_map [texture name] [#uv]Name of the diffuse texture for the base image (optional, otherwise a dummy is set)The #uv parameter is optional, and specifies the texcoord set that willbe used. Valid range is [0; 8)If the Renderable doesn&#39;t have enough UV texcoords, HLMS will throw an exception.Note: The UV set is evaluated when creating the Renderable cache.* diffuse_map1 [texture name] [blendmode] [#uv]Name of the diffuse texture that will be layered on top of the base image.The #uv parameter is optional. Valid range is [0; 8)The blendmode parameter is optional. Valid values are:NormalNonPremul, NormalPremul, Add, Subtract, Multiply,Multiply2x, Screen, Overlay, Lighten, Darken, GrainExtract,GrainMerge, Differencewhich are very similar to Photoshop/GIMP&#39;s blend modes.See Samples/Media/Hlms/GuiMobile/GLSL/BlendModes_piece_ps.glsl for the exact math.Default blendmode: NormalPremulDefault uv: 0Example: diffuse_map1 myTexture.png Add 3* diffuse_map2 through diffuse_map16Same as diffuse_map1 but for subsequent layers to be applied on top of the previousimages. You can&#39;t leave gaps (i.e. specify diffuse_map0 & diffuse_map2 but notdiffuse_map1).Note that not all mobile HW supports 16 textures at the same time, thus we willjust cut/ignore the extra textures that won&#39;t fit (we log a warning though).* animate <#uv> [<#uv> <#uv> ... <#uv>]Enables texture animation through a 4x4 matrix for the specified UV sets.Default: All UV set animation/manipulation disabled.Example: animate 0 1 2 3 4 5 6 7* alpha_test [compare_func] [threshold]When present, mAlphaTestThreshold is used.compare_func is optional. Valid values are:less, less_equal, equal, greater, greater_equal, not_equalThreshold is optional, and a value in the range (0; 1)Default: alpha_test less 0.5Example: alpha_test equal 0.1*/
}

这里通过注释的方式&#xff0c;把每个支持的数据都标出来了。通过之前的学习知道&#xff0c;这些数据可以来自script&#xff0c;也可以通过代码设置。

datablock里的数据与property里的是一一对应的&#xff0c;renderable持有了一个datablock&#xff0c;最终会把 datablock里的数据设置到property里。

void HlmsPbs::calculateHashForPreCreate( Renderable *renderable, PiecesMap *inOutPieces )
{assert( dynamic_cast<HlmsPbsDatablock*>( renderable->getDatablock() ) );HlmsPbsDatablock *datablock &#61; static_cast<HlmsPbsDatablock*>(renderable->getDatablock() );const bool metallicWorkflow &#61; datablock->getWorkflow() &#61;&#61; HlmsPbsDatablock::MetallicWorkflow;const bool fresnelWorkflow &#61; datablock->getWorkflow() &#61;&#61;HlmsPbsDatablock::SpecularAsFresnelWorkflow;setProperty( PbsProperty::FresnelScalar, datablock->hasSeparateFresnel() || metallicWorkflow );setProperty( PbsProperty::FresnelWorkflow, fresnelWorkflow );setProperty( PbsProperty::MetallicWorkflow, metallicWorkflow );
// ...}

已知的是&#xff0c;创建的时候是通过item->setDatablock(…)

void Item::setDatablock( HlmsDatablock *datablock ){SubItemVec::iterator itor &#61; mSubItems.begin();SubItemVec::iterator end &#61; mSubItems.end();while( itor !&#61; end ){itor->setDatablock( datablock );&#43;&#43;itor;}}

内部会调用 subItem->setDatablock(…)

void Renderable::setDatablock( HlmsDatablock *datablock )
{
// ...
}

class _OgreExport SubItem : public RenderableAnimated

class _OgreExport RenderableAnimated : public Renderable

SubItem 是 Renderable。

从material 到 hlms property&#xff0c;hlms 算走通了一半。设置完属性后&#xff0c;就应该设置往shader送数据了。
还有 hlms的几个cache没有涉及到

to be continue…


推荐阅读
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 在编程笔试和面试中,全排列算法因其适中的难度而备受青睐,不仅能够考察应聘者的算法基础,还能测试其对递归和回溯的理解。本文将深入解析全排列算法的实现原理,探讨其应用场景,并提供优化建议,帮助读者更好地掌握这一重要算法。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 解析 /etc/pki/tls/certs/cabundle.crt 文件的主要功能与应用场景 ... [详细]
author-avatar
成长的人走在路上_774
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有