【发布时间】:2021-06-19 07:37:15
【问题描述】:
经过一番搜索,据说分离的VAO共享完全相同的着色器属性布局,将它们合并到一个VAO中并将所有这些数据放入一个VBO中,这样我就可以只用一个draw call来绘制这个对象。
这完全有道理,但是统一变量呢?假设我想画树和球。它们具有不同的顶点数,具有不同的变换,但共享完全相同的着色器程序。
到目前为止,我的程序是这样的
// generate VAOs, called only once
glGenVertexArray(1, &treeVaoId);
// generate VBO and bind tree vertices
// enabled vertex attribute and set it for shader program
glGenVertexArray(1, &ballVaoId);
// repeat for ball
// draw, called each frame
// give the tree's transform to shader as uniform
glDrawArrays(...) // first draw call
// repeat for ball
glDrawArrays(...) // second draw call
将这些顶点连接到一个 VAO 和 VBO,例如:
glGenVertexArray(1, &treeBallId);
// generate enough size of VBO and bind tree vertices and ball vertices after it.
// enabled vertex attribute and set it for shader program
// to draw, I have to separately give transform to it's uniform to each tree and ball, but how?
glDrawArrays(...)
对不起,这个例子很糟糕,但重点是,有没有办法在绘制一个 VAO 时给出不同的统一变量?或者,我的方法完全错误吗?
【问题讨论】:
-
您可以将所有制服存储在 UBO 中。然后,您需要对该缓冲区的索引,或者一个附加属性,或者您也可以查看间接绘制命令。与发出两个单独的绘图调用相比,这是否会给您带来更好的性能:取决于您的具体情况。