我正在受 XNA/MonoGame 界面的启发在 OpenGL 中制作 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);
一个精灵包含四个顶点、颜色和纹理坐标,而其他三个可以包含任意数字(精灵和形状具有唯一的变换)。一切都可以有纹理或无纹理。我想批量处理所有内容以减少状态更改和 OpenGL 绘制调用的数量。我认为假设大多数提交将具有共享顶点是合理的,这样我就可以使用 glDrawElements 而不是 glDrawArrays,但是鉴于我上面描述的内容,我很难弄清楚如何正确地批处理事情。
XNA/MonoGame 精灵批处理器之所以有效,是因为它们仅适用于带纹理的四边形/三角形,而不是任意形状。或者,我可以像 SFML 渲染器一样为每个可绘制对象发出绘制调用,但这违背了批量渲染的目的。
我觉得我的渲染器正在尝试“做所有事情”,这是我想要避免的,因为在我的经验中它通常很快变得太复杂。
我要问的是:我怎样才能重新设计我的渲染器?我可以为不同的提交保留单独的批次列表吗?我可以以某种方式模块化我的渲染器吗?我应该只允许 XNA/MonoGame 中的纹理对象吗?