低级游戏引擎渲染器devise

我正在拼凑一个非常基本的引擎的开始,这将允许我绘制任意对象( SceneObject )。 我已经到了创建一些合理的听起来很不错的地步了,但是因为这是我第一次进入游戏引擎,所以我已经有了这种感觉。 我熟悉将大部分代码分隔开来,这样个别的子系统就不会彼此过度交互,但是我正在考虑更多低层的东西,从顶点开始。

所以,如果我有一个Vertex类,我可以结合一系列索引列表来创建一个Mesh类。 引擎如何确定对象的相同网格? 或者,这是左边的关卡devise师? 一旦我们有一个Mesh ,它可以包含在SceneObject类中。 并且SceneObject的列表可以被放置到要绘制的Scene中。

现在我只使用OpenGL,但我知道我不想将OpenGL调用绑定到基类(例如更新Mesh的顶点,我不想调用glBufferData等)。

有没有讨论这些问题的好资源? 有没有什么“共同”的hairachies应该使用?

网格类应包含更多的东西,如AABB和材料信息。 您甚至可能发现自己需要在一个类中存储多个网格。 或者也许你可能需要不同的顶点格式。 看来你已经开始在你的游戏之前建立你的引擎。 而这从来没有帮助。 你应该试着去思考你现实需要和想象的devise。

在基类中绑定OpenGL调用并不坏。 这只是意味着你不会使用另一个API。 没有人需要同时使用两个API。 如果您发现自己需要多个渲染器(即使您不应该使用OpenGL),将渲染器作为游戏传递数据的服务来执行也更容易,只需简单地将渲染它想要的方式。 但是我也成功地制作了一个低级别的API包装器,这样path(即使稍微复杂一点)也是一个有效的path,只要function集允许它(需要着色器支持才能工作)。

至于常见的层次结构,请尝试如下所示:

 class SceneInfo { MeshList meshes; ParticleSystemList pslist; ... } class Renderer { function Render( SceneInfo* info ); } class Game { SceneInfo info; Renderer renderer; } 

我猜你的Vertex类实际上代表一个顶点缓冲区(而不是组成你的网格的数千个顶点对象的集合)。 当我开始制作低级渲染引擎时,我有一个Mesh类只需要一个IndexBufferVertexBuffer类,因为我没有看到需要在Mesh之后用另一个Mesh交换索引缓冲区的位置完全建成。 (这个术语反映了我正在使用的DirectX)

这些缓冲区是用独立的IndexLoaderVertexLoader类来初始化的,这些类inheritance了一个基类Loader类。 FileReader类读取网格文件并吐出加载器使用的结构。 事后看来,这可能是过度工程,但我想保持加载的东西与渲染分开。

Scene将网格集中以进行更新和渲染。 SceneRenderer具有对场景的引用,如果您需要多个渲染层,则可以使用不同的场景进行交换。

我想介绍一下这个场景的一些基本的select,所以我保留了一个有序的列表和一个无序的Meshes列表。 每个创建的Mesh首先进入有序列表,而无序列表保留指向那些需要在该帧中绘制的指针。

插入到有序列表的时间是线性的* log n我相信,因为我使用了string句柄sorting使二进制search成为可能。 这样可以快速访问需要绘制的网格物体(日志时间)并将其复制到无序列表中。 场景绘制时,SceneRenderer以线性时间遍历这个列表。