问题描述
我正在开发一个极简的 2D 用户界面工具包,需要绘制大量矩形。我有一个渲染类,它使用循环绘制所有矩形,每次为矩形属性设置制服,例如填充、颜色、边框宽度、绘制颜色是否反转等,然后使用 GL_TRIANGLES 调用 glDrawArrays。我的片段着色器使用这些统一值。为了绘制一个反转颜色的矩形,我使用 glBlendFunc。@H_404_1@
我每个矩形有一个 VAO/VBO。显然这是低效的,我想在我的所有矩形中使用一个 VAO,并使用单个绘制调用绘制矩形,而不是循环遍历它们并设置统一值并每次调用 glDrawArrays。@H_404_1@
我想我可以将每对三角形放在一个 VBO 中,或者可能对所有矩形使用一个 VBO,但是我该怎么处理制服,我应该使用顶点属性来代替,并尝试将它们传递给片段着色器,即使每个矩形的属性在顶点之间保持相同?@H_404_1@
解决方法
使用大量绘制调用对于 CPU 负载来说很糟糕,因此您肯定希望将尽可能多的矩形批处理为单个绘制。
如果您批处理到单个绘图中,则只能使用单一的属性流配置,因此该批处理中的所有矩形都需要位于同一组 VBO 和相同的 VAO 布局中。
听起来你不会有大量的顶点,所以将它打包到属性流中听起来和任何东西一样好,但你可以使用由实例 ID 索引的统一数组(每个矩形一个实例) .