TLDR:首先使组件包含多个网格。
我同意Asakeron / Byte56 / Laurent的观点,即在网格/材质对与实体本身之间还需要另一个间接层次。与其将GraphicsComponent视为顶点和材质,不如将其视为最终栅格上的像素斑点-它/它们如何到达那里是实现细节,仅此而已。
我为我的项目考虑了很多,我认为最佳的解决方案是使GraphicsComponent成为更高级别的组件,包含传统的“模型”对象的许多功能-因为此功能不是可选的!要渲染这些多边形,不仅需要缓冲区数据和着色器,例如:
- 您提到的位置
- 蒙皮/动画数据
- 当前通行证(例如,如果使用两个通行证alpha)
- 阴影投射信息(如果正在执行)
- 有关如何的信息以及何时更新资料的信息
- 剔除功能
而且这仅用于3D资产,而没有考虑粒子系统,广告牌等。但是所有这些都仅与图形/渲染代码相关-它不影响物理,声音或脚本,因此应该将其放置在其中图形/渲染组件。
我最终得到了:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
在此:
为了简化和向后兼容,在我的系统中也有一些折衷,例如每个GraphicsComponent也是一个Entity,并且Entity直接存储Position数据,因此仅在一个位置计算它,但是想法是相同的:GraphicsComponent处理什么是绘制项目所需的-所有所需的内容-不仅限于建模者提供的内容。