我用UBO替换了shader中的mvp矩阵等制服,以避免大量的glUniform ...()调用。但是为了在每个帧中更新UBO,我必须调用glBufferData(),这也会降低性能。现在我对是否回到使用制服或在着色器中使用统一块感到困惑。
答案 0 :(得分:3)
指定一堆glUniform
次调用通常比对glBufferData
的单次调用要慢,除非您每帧只修改几个统一值。
因此,您应该基于此决定采用哪种策略。几个笔记:
glBufferData
可能不是更新缓冲区的最佳方法,因为它要求驱动程序在从调用返回之前从您提供的指针中复制数据。我会尝试使用glMapBufferRange
并直接将更改写入其中。请记住,为了避免同步,您需要告诉驱动程序您不会从它给您的指针读取,并且您将使用标志GL_MAP_WRITE_BIT
和{{来编写整个范围。 1}}