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

在Nebula3中加载自定义模型的思路

Nebula3中目前还是没有地形

不过冒似国外的引擎除了CryEngine外对于地形都不重视…..

之前看了下WOW的地形组织方式, 一直在想怎么把它加进来

模模糊糊地感觉到, 它应该是把Model当成了最基本的渲染单位

地形是不是也需要包装成模型呢? 也就是说, 地形对于引擎来说是个上层概念, 不应该放到Graphics内部去管理. , 虽说地形也是一种特殊的模型, 但它的管理方式相对来说太过于特殊了, 不知道还能不能跟模型走一条管线.

先看看植被是怎么组织的:

(这里不讨论其原理, 因为这个系统是依赖Nebula Maya Toolkit)(: 这设计简直是中央集权….几乎每个类都要跟renderer打交道-_-)

, 这里的渲染单位是GrassPatch, 它包装了一个InternalModelEntity, 然后扔给InternalStage就完成它的使命了. 下面主要看看这个graphicsEntity是怎么生出来的:

InternalModelEntity是场景管理中的基本图形对象(同级的还有摄像机和灯光), 这里面包含了一个ManagedModel.

ManagedModel是对于实际资源(Model)的管理包装, 源子系统. 根据资源的使用反馈来动态调整资源的细节等级. 资源的管理/加载都是在这一模块中进行的

Model就代表实际的模型了, 它由一系列层次结构的ModelNode组成. 在这里只有ShapeNode, 即静态图形. 通常情况下这就已经可以用来表示一个三维世界了. 至于粒子/动画之类的, 那是另外的ModelNode派生子类.

ShapeNode中包装的是ManagedMesh, 不过这个就不用手动去构造了, N3提供一个MemoryMeshLoader, 直接从VB/IB进行构造. 由于ShapeNode是继承于StateNode, 那它同时也包含了渲染所需要的材质(shader, shader parameters, textures)

VertexBufferIndexBuffer的构造就简单多了, 之前写的几个小例子都是直接从内存加载的.

那么, 反过就是InternalModelEntity的自定义构造流程:

1. 把顶点数据加载到内存, 利用MemoryVertexBufferLoader创建出VertexBuffer. IndexBuffer同理, 还有它俩相关的PrimitiveGroup…(看来都比倾向于一个大buffer存数据, 多次draw)

2. 创建ShapeNode, 利用MemoryMeshLoader加载1中的数据到实例中, 同时设置shader和相应参数(纹理也是shader 参数的一种, 渲染状态是包含在fx中的, 所以也属于shader)

3. 创建ManagedModel, 创建一个Model, Model设置给ManagedModel. 然后把2中的ShapeNode AttachModel, 并利用一个EmptyResourceLoader来完成资源状态的切换(因为数据已经有了, 需要把资源状态切换到加载完成才能使用)

4. 创建InternalModelEntity, 利用SetManagedModel3的结果给塞进去

5. InternalGraphicsServer::Instance()->GetDefaultView()->GetStage()得到默认的场景后, InternalModelEntity通过AttachEntity加入场景, 之后就不用操心了. 场景管理器会自己去画.

知道了这些, 写个自定义模型格式的ModelLoader就很容易了, 嘿嘿

不知道把Terrain Tile当成ModelEntity可不可行, 这样的话连摄像机裁剪都省了-_-. 能需要特殊的ResourceMapper来管理地形的LOD…, 如果这个思路可行的话, 地形完全可以做成addon

相关文章:

  • asp.net core 部署在ubuntu
  • 获取当前月的第一天和最后一天...
  • tensorflowsharp异常could not load DLL 'libtensorflow'
  • 为ArcGIS Server配置反向代理
  • A potentially dangerous Request.Form value was detected from the client
  • 发布vue程序到azure
  • RHEL5下unixODBC 与 sqliteodbc 连接配置
  • 在ubuntu安装开源人脸类库dlib
  • qmake手册(初级部分)
  • 《码农经验手册》-拿到需求写代码前,要思考的问题有哪些?
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之9---移动增值业务产业链...
  • 《码农经验手册》-新手和老司机
  • Azure 聊天机器人-1 环境搭建
  • Azure 聊天机器人2
  • 通过Socket configuration controls 获取网络设备地址
  • ➹使用webpack配置多页面应用(MPA)
  • Android Studio:GIT提交项目到远程仓库
  • Java 网络编程(2):UDP 的使用
  • javascript 哈希表
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux快速复制或删除大量小文件
  • mysql innodb 索引使用指南
  • PaddlePaddle-GitHub的正确打开姿势
  • scala基础语法(二)
  • springboot_database项目介绍
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 分享几个不错的工具
  • 机器学习 vs. 深度学习
  • 面试遇到的一些题
  • 巧用 TypeScript (一)
  • 十年未变!安全,谁之责?(下)
  • 双管齐下,VMware的容器新战略
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #数学建模# 线性规划问题的Matlab求解
  • $$$$GB2312-80区位编码表$$$$
  • (初研) Sentence-embedding fine-tune notebook
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)Linux Shell编程——输入输出重定向
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *Django中的Ajax 纯js的书写样式1
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Standard 的管理策略
  • .NET 的程序集加载上下文
  • .net操作Excel出错解决
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • @Builder用法
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [20150321]索引空块的问题.txt
  • [20161101]rman备份与数据文件变化7.txt
  • [3D基础]理解计算机3D图形学中的坐标系变换