我有接近10000个顶点缓冲区(不同大小)和每个缓冲区对应的整数数据。因此,当我渲染时,我会执行以下操作:
Bind shader
For each vertex buffer:
Set uniform
Bind vertex buffer
Draw call
如此多的统一更改确实会使程序变慢。
所以我在考虑使用统一的缓冲区对象或ssbo,然后将整数数组发送到着色器,然后通过每次绘制调用以某种方式将其索引到数组中。是否有办法以某种方式知道在着色器中正在处理哪个绘制调用?
通常,OpenGL不计算绘图调用。您必须自己管理一个统一的计数器,或者可以为每个网格生成一个SSBO,并在进行绘制调用之前绑定属于该网格的SSBO。
我看到的一种可能性是使用多次抽奖(请参阅参考资料glMultiDrawArrays
)。但是随后,您必须将所有网格的数据存储在同一缓冲区对象中,并且所有网格的顶点属性规范必须相同,并存储在一个“顶点数组对象”中。
绘图命令的索引存储在内置的顶点着色器输入变量中gl_DrawID
(需要GLSL 4.60或ARB_shader_draw_parameters)。
改善性能的另一种方法是对网格进行分类,以便对制服的更改更少。如果存在具有相同统一设置的网格,则连续渲染它们,而不必在两者之间设置统一。
通过不渲染可以实现最佳的性能改进。不渲染所有网格,仅渲染视口中“可见”的几何。
您可以实施一些简单的剔除测试,例如View Frustum Culling。如果网格物体的边界框或边界球不在适当位置且未与“视锥”相交,则跳过该网格。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句