glColorPointer尝试改进fps

时间:2011-05-27 11:22:57

标签: opengl pyopengl

我已经达到了可以为我的顶点添加一些颜色的点。但现在我想提高我的FPS率。这是目前的情况。我有大量的顶点(~200000),每个顶点可以在~150个类之一。每个班级都有不同的颜色。我正在绘制我的顶点,如:

    glEnableClientState(GL_VERTEX_ARRAY)         
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glVertexPointer(3, GL_FLOAT, 0, None)          
    glEnableClientState(GL_NORMAL_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glNormalPointer(GL_FLOAT, 0, None)     
    glEnableClientState(GL_COLOR_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferColors)
    glColorPointer(3, GL_FLOAT, 0, None)
    glDrawArrays( GL_POINTS, 0, len(self.vertices) / 3 )

一切正常,FPS约为60。我的所有缓冲区仅在初始化时生成。但是现在代表每个类的颜色会快速变化,大约每毫秒一次。随着颜色也会改变,所以我必须为每次绘制重新创建我的颜色缓冲区,对于200000个顶点,我感觉FPS将接近0.我试图实现的修复是保持固定的颜色缓冲区,但它们将保留指向它所代表的类的指针,而不是实际的颜色。这样,只有200种颜色的类会改变。问题是我不知道如何在OpenGL中实现这一点。这可行吗?有关如何执行此操作的任何指示?

2 个答案:

答案 0 :(得分:2)

类不应该设置一维纹理坐标,而是更改那个巨大的数据集,而不是只替换部分纹理。为了避免纹理采样插值,将纹理设置为GL_NEAREST过滤模式,并在每个顶点的顶点着色器中对纹理进行采样(即,通常不按照每个片段纹理采样)。

答案 1 :(得分:0)

我认为你应该认真看看着色器。您不应该每次都重新创建缓冲区。 http://en.wikipedia.org/wiki/GLSL。着色器将使用缓冲区以颜色和几何体执行各种操作。