问题:
在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​);

circleinstancecount中的顶点数计算点数

10-04 12:46