我在XGL/MonoGame接口的启发下在OpenGL中制作2D批处理渲染器,但我遇到了一个小的设计问题,我正在寻找一些输入。目前,您可以通过以下四种方式一般提交的顶点数据:在OpenGL批处理渲染器中批处理任意顶点数据
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 sprite batchers的工作原理是,它们只与纹理四边形/三角形一起工作,而不是任意形状。或者,我可以像SFML渲染器那样做,并为每个可绘制对象发出绘图调用,但这会破坏批渲染的目的。
我觉得我的渲染器试图“做所有事情”,这是我想避免的,因为它通常会很快变得过于复杂。
我问的是:我怎么能重新设计我的渲染器?我可以为不同的提交保留单独的批次清单吗?我能以某种方式模块化渲染器吗?我应该只允许在XNA/MonoGame中完成纹理对象吗?
这是一些非常可靠的信息,非常感谢。我实际上总共创建了三个渲染器(支持用于教育目的的不同版本),但我的看法转化得很好,据我所知。我的顶点具有相同的格式。当使用混合函数时,我只会插值0和1,完整的纹理颜色或完整的顶点颜色,对不对?转换完全按照您的建议处理。我还考虑过在批处理渲染之前的某个时间将未经过处理的对象复制到批处理中。我不知道gDebugger,感谢您的链接! – NordCoder