我正在使用OpenGL制作一个受XNA/MonoGame界面启发的2D批处理渲染器,但我遇到了一个小的设计问题,需要一些意见。目前,可以通过以下四种常见方式提交顶点数据:
void Render(const Sprite& sprite);
void Render(const Shape& shape);
void Render(const Vertex* vertices, unsigned int length);
void Render(const Vertex* vertices, unsigned int length, const Texture* texture);
一个sprite包含四个顶点、颜色和纹理坐标,而其他三个可以包含任意数量的内容(sprite和shape具有独特的变换)。所有的东西都可以被纹理化或未被纹理化。我想要将所有东西批量处理以减少状态改变和OpenGL绘制调用的数量。我认为可以合理地假设大多数提交都有共享的顶点,这样我就可以使用glDrawElements而不是glDrawArrays,但是我在考虑如何正确地批处理时遇到了困难。
XNA/MonoGame sprite批处理器之所以工作是因为它们仅与纹理化的四边形/三角形一起使用,而不是任意形状。或者,我可以像SFML渲染器一样为每个可绘制对象发布一个绘制调用,但这违背了批处理渲染的目的。
我觉得我的渲染器正在尝试“做所有事情”,这是我想要避免的,因为在我的经验中,它通常很快变得过于复杂。
我想问的是:我应该如何重新设计我的渲染器?我能否保留不同提交的单独批处理列表?我能否以某种方式将我的渲染器模块化?我是否应该只允许纹理化的对象,就像XNA/MonoGame一样?