问题:
在3D空间中,有很多要点。我需要在每个点的位置绘制一个单位圆。
而且所有圆的法线都应该始终垂直于设备的屏幕,并且大小不应该
即使我旋转或放大/缩小 View 也改变了。
我的方法:
首先,我有一个大数组来存储每个点的xyz坐标。
for each point in the array:
apply a model view matrix // to keep the normal perpendicular and the same size
draw a unit circle with gl* functions
通过这种方法,当点数达到10000时,我得到非常差的FPS。
这是非常低效的。有没有更好的方法来解决这个问题?或一些OpenGL
技巧可以用吗?
最佳答案
您可以绘制它们instanced(从3.3或扩展名ARB_instanced_arrays
开始可用)
您准备了一个用于绘制的单位圆(使用单独的属性作为添加到顶点着色器中的点的位置)
每个点的位置都放在一个单独的VBO中,并用
void glVertexAttribDivisor(GLuint index, GLuint divisor);
然后你用
void glDrawArraysInstanced( GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
用
circle
和instancecount
中的顶点数计算点数