C++ Opengl减少制服的使用

C++ Opengl减少制服的使用,c++,opengl,C++,Opengl,我有近10000个顶点缓冲区(不同大小)和每个缓冲区对应的整数数据。所以当我渲染时,我会这样做: Bind shader For each vertex buffer: Set uniform Bind vertex buffer Draw call 这么多的一致性变化确实减慢了程序的速度 因此,我考虑使用统一缓冲区对象或ssbo,将一个整数数组发送到着色器,然后在每次绘制调用时以某种方式索引到数组中。 有没有办法知道着色器中正在处理哪个绘图调用?通常,OpenGL不计

我有近10000个顶点缓冲区(不同大小)和每个缓冲区对应的整数数据。所以当我渲染时,我会这样做:

Bind shader
For each vertex buffer:
    Set uniform
    Bind vertex buffer
    Draw call
这么多的一致性变化确实减慢了程序的速度

因此,我考虑使用统一缓冲区对象或ssbo,将一个整数数组发送到着色器,然后在每次绘制调用时以某种方式索引到数组中。
有没有办法知道着色器中正在处理哪个绘图调用?

通常,OpenGL不计算绘图调用。您必须自己管理一个统一计数器,或者您可以为每个网格生成一个SSBO,并在draw调用之前绑定属于该网格的SSBO

我能看到的一种可能性是使用(见)。但是,您必须将所有网格的数据存储在相同的缓冲区对象中,并且所有网格的顶点属性规范必须相同,存储在一个缓冲区中。
绘图命令的索引存储在内置顶点着色器输入变量中(需要GLSL 4.60或)


提高性能的另一种方法是对网格进行排序,以便减少对制服的更改。如果存在具有相同统一设置的MEHE,则依次渲染它们,而不在其间设置统一


不渲染可以实现最佳性能改进。不要渲染所有网格,只渲染视口中“可见”的几何体。

您可以实现一些简单的剔除测试,如。如果网格的边界框或边界球体不在适当位置且不与网格相交,则跳过网格。

不幸的是,每个统一体都是唯一的,按照当前的实现方式,在单个vbo中组合网格的程序是不可能的。谢谢tho@eggboy不幸的是,没有办法。如果你想提高性能,那么你必须找到一些不变的东西或网格共享的东西。正如你所说的,最好的改进就是截头体剔除。“如此多的一致性更改确实会减慢程序的速度。”很可能缓冲区绑定对你的伤害比一致性更改更大。