在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)

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

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

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

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

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

4. 创建InternalModelEntity, 利用SetManagedModel把3的结果给塞进去

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

2018-08-25 2000万条数据迁移从几天到几个小时

一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全。让我这个编程小白学到了很多性能优化的知识,或者说一些思考方式...

23120
来自专栏Java技术栈

TBSchedule应用实战之“性能怪兽(集群篇)“

本节的重点将采用原生java,tbs和xxl-job三个模型来测试处理50万业务数据,总结他们的差异,向读者朋友们展示为什么作者称tbs为性能怪兽。 本节以实际...

39170
来自专栏数据结构与算法

万能pb_ds头文件—bits/extc++.h

c++中自带了一些非常强大却鲜为人知的功能库—pd_ds库 里面含有红黑树(rb_tree),哈希表(gp_hash_table),可持久化平衡树(rope)等...

43760
来自专栏Python中文社区

用Python玩转微信的正确姿势!

0. itchat 最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。 然后发现了itchat这...

62280
来自专栏Java后端技术栈

初探性能优化--2个月到4小时的性能提升!

一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全。让我这个编程小白学到了很多性能优化的知识,或者说一些思考方式...

8510
来自专栏UML

用例图示例:包含和扩展用例

用例提供了系统的高级视图。用例建模是与用户和其他利益相关者就系统和目标进行沟通的有效方式。用例描述了系统执行的动作序列,其为特定的actor产生可观察的值结果。...

47190
来自专栏Golang语言社区

【Go 语言社区】在 Go 语言中,如何正确的使用并发

Glyph Lefkowitz最近写了一篇启蒙文章,其中他详细的说明了一些关于开发高并发软件的挑战,如果你开发软件但是没有阅读这篇问题,那么我建议你阅读一篇。这...

36690
来自专栏老秦求学

深入理解计算机系统读书笔记之第一章:漫游

我是从豆瓣上看到好多人都在推荐这本书,于是就去借来读一读,昨天晚上用了好长时间来读这本书的第一章节,感觉这本书比较符合我(有些基础还不太明白,这本书详细的进行了...

32270
来自专栏牛客网

2018腾讯、美团C++后台研发实习生面经

30800
来自专栏Golang语言社区

在 Go 语言中,如何正确的使用并发

Glyph Lefkowitz最近写了一篇启蒙文章,其中他详细的说明了一些关于开发高并发软件的挑战,如果你开发软件但是没有阅读这篇问题,那么我建议你阅读一篇。这...

20700

扫码关注云+社区

领取腾讯云代金券