【发布时间】:2015-03-17 23:33:17
【问题描述】:
所以,我需要一种使用一次绘制调用来渲染多个对象(而不是实例)的方法。实际上我知道如何做到这一点,只是将数据放入单个 vbo/ibo 并使用 glDrawElements 进行渲染。
问题是:使用 glUniform 更新统一数据而不为每个对象设置统一数据的有效方法是什么...?
如何设置一个包含数十个对象的所有统一数据的缓冲区,包括 MVP 矩阵,绑定它并使用单个绘制调用执行渲染? 我尝试使用 UBO,但这根本不是我需要的。
对于渲染实例,我们只需将包括矩阵在内的统一数据放在另一个 VBO 中,并使用 glVertexAttribDivisor 设置属性除数,但它仅适用于实例。
有没有办法在 OpenGL 中实现我想要的?如果没有,我该如何克服为数十个对象设置统一数据的开销?
例如这样:
{
// setting up VBO
glGenBuffers(1, &vbo);
glBindBuffer(vbo);
glBufferData(..., data_size);
// setup buffer
for(int i = 0; i < objects_num; i++)
glBufferSubData(...offset, size, &(objects[i]));
// the same for IBO
.........
// when setup some buffer, that will store all uniforms, for every object
.........
glDrawElements(...);
}
提前感谢您的帮助。
【问题讨论】:
-
为什么 UBO 不是您需要的?听起来它可以解决你的问题。另一方面,您确定这是您程序的瓶颈吗?对我来说听起来有点像过早的优化......
-
它没有解决问题,因为在哪里会有很多对象,不是 10 或 100,而是更多。而 UBO 用于设置着色器统一块,即需要为每个对象更新它。(即使将所有统一数据存储在单个 UBO 中)所以,Reto Koradi 给出了一个很好的答案,我认为它解释了所有我想要。