繁体   English   中英

Opengl 减少制服的使用

[英]Opengl reduce usage of uniforms

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

Bind shader
For each vertex buffer:
    Set uniform
    Bind vertex buffer
    Draw call

许多统一的变化确实减慢了程序的速度。

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

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

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


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


最好的性能提升可以通过不渲染来实现。 不要渲染所有网格,只渲染在视口中“可见”的几何体。
您可以实现一些简单的剔除测试,如View Frustum Culling 如果网格的边界框或边界球不在位且不与视锥体相交,则跳过网格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM