如何提高静态复杂集合体的渲染速度?显示列表 or 缓冲区对象?
各位,现在用opengl做一个项目,需要载入一些顶点数据量比较大的静态模型。原先用显示列表去显示这些模型,但是发现随着模型数据量(顶点,法线向量等)的增大,帧数会明显下降。老师建议用缓冲区对象把顶点,法线,以及索引信息全放到GPU内存中去。
我的做法是类似
glGenBuffers(BUFFERNUM,buffers);
//绑定vertex数组
glBindBuffer(GL_ARRAY_BUFFER,buffers[0]);
glBufferData(GL_ARRAY_BUFFER,VertexArraySize,(double*)vertices,GL_STATIC_DRAW);
glVertexPointer(3,GL_DOUBLE,0,BUFFER_OFFSET(0));
glEnableClientState(GL_VERTEX_ARRAY);
。。。。。。
分别绑定顶点,索引,和法向量缓冲区,然后调用gldrawElement来画图。
但是这么做好像对速度的改善也不明显。Ps:顶点数6W左右,面12W左右
请问各位,我这么种做法算是把数据量放到GPU内存中了么?
为什么渲染速度没感觉到明显地变化呢?
如果要想进一步提高渲染速度,应该从什么地方入手呢?
[解决办法]
最有效的提升办法就是减少扔给显卡处理的数量
比如, 自己写一个视锥裁剪算法,判断物体的包围盒是否可见,如果不可见,整个模型都不去处理
再比如,自己写一个遮挡算法, 被憋得物体遮挡的模型,也不处理
这些东西涉及到你的场景组织方式和资源的管理方式,没有固定的解决方案,需要根据自己的项目实际情况去分析
[解决办法]
无解。相同情况下,数据量变大,速度自然慢了。
这种情况只能用有损优化,近处的物体用原有的模型绘制(俗称精模),远处的物体用低模去绘制,这种优化俗称:模型lod。甚至近处的模型也可以考虑适当降低模型精度。