0

我有一个正在运行的程序,它使用 glVertexPointer、glNormalPointer 等来绘制大量元素。这工作在 30 FPS 左右。现在我已经达到了集成着色器将是一个可行的选择的地步(每个顶点都需要有一个基于特定类计算的颜色)。1. 现在我的第一个问题是使用着色器对我的 FPS 有多大影响?我当前的实现(我 99.99% 至少在某些方面存在缺陷,将在下面发布代码)将 FPS 大幅降低到 3 FPS。如果这种 FPS 下降是正常的,那么就没有必要与之抗争了。

现在来看一些代码。我的着色器看起来像:

 vertexsource = """
                  attribute vec3 position; 
                  attribute vec3 normal;
                  varying vec3 norm; 
                  varying vec3 color_out;
                  uniform vec3 color_in;

                  void main() 
                  { 
                      gl_Position = gl_ModelViewProjectionMatrix * vec4( position,1);
                      color_out = color_in; 
                      norm = normal;
                  }""" 
fragmentsource = """ 
                  varying vec3 norm; 
                  varying vec3 color_out;
                  void main() 
                  { 
                      gl_FragColor = vec4( color_out, 1.0);
                  }""" 
vshader = compileShader( vertexsource, GL_VERTEX_SHADER )
fshader = compileShader( fragmentsource, GL_FRAGMENT_SHADER )
program = compileProgram( vshader, fshader ) 
color = glGetUniformLocation( program, "color_in")
normal = glGetAttribLocation( program, "normal" )
position = glGetAttribLocation( program, "position" )
glUseProgram( program )
glUniform3fv( color, 3, (0,0,1) )
return position, normal

所以我返回位置和法线,因为稍后我将使用它们来传递实际的顶点和法线。从这里我有一个问题。如果没有着色器,我只需使用 VertexPointer 和 NormalPointer 传递法线和顶点数组,其余部分由 OpenGL 处理。2. 我已经读到着色器内置了 gl_Vertex 和 gl_Normal 属性。如何将值从我的 VBO 传递给这些?正如您所看到的,目前我将顶点位置传递给属性位置,将法线传递给法线,但我没有对法线做任何事情,因为我不知道是什么。

绘图是这样完成的:

    glEnableVertexAttribArray( self.position )
    glEnableVertexAttribArray( self.normal )      
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glVertexAttribPointer( self.position, 3, GL_FLOAT, GL_FALSE, 0, None )          
    glEnableClientState(GL_NORMAL_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glVertexAttribPointer( self.normal, 3, GL_FLOAT, GL_FALSE, 0, None )
    glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

这里 self.bufferVertices,self.bufferNormals 是 VBO 包含我的顶点和法线。self.triangles 索引数组。到目前为止,它绘制了正确的索引,但如前所述,我的 FPS 非常低。

  1. 这个绘图顺序正确吗?还有其他东西在启用时可能与着色器冲突吗?( GL_LIGHTNING,GL_DEPTH_TEST等等)
4

1 回答 1

3

每次调用该函数(第一个代码)时,您是否都在编译着色器?

于 2011-10-04T16:34:13.083 回答