【发布时间】:2013-08-07 10:26:32
【问题描述】:
我正在 OpenGL 中制作一个 2D 批处理渲染器,灵感来自 XNA/MonoGame 界面,但我遇到了一个小设计问题,我正在寻找一些输入。目前,您可以通过四种通用方式提交顶点数据:
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 中的纹理对象吗?
【问题讨论】: