OpenGL着色器问题

时间:2011-06-08 09:51:20

标签: opengl glsl pyopengl

确定,

这是我第一次尝试使用这样的着色器。我有一个正在运行的程序,它使用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_LIGHTNINGGL_DEPTH_TEST等等)

1 个答案:

答案 0 :(得分:3)

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