OpenGL着色器问题

问题描述:

好的,OpenGL着色器问题

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

着色器看起来很合理,因为它是一个简单的通过着色器,它实际上应该比固定函数更快。顺便说一句,只要使用通常的属性('glVertex/glVertexPointer','glNormal/glNormalPointer',...)设置bultin'gl_Vertex','gl_Normal',...属性,这是他们的优势。 – 2011-06-08 10:38:02

+0

正如Christian所言,着色器代码看起来很健全,就像你发布的其他东西一样......性能的下降绝对不是正常的。这是在运行什么硬件?性能的这种急剧下降可能意味着软件回退。 – 2011-06-08 12:56:08

+0

它运行在MAC OS X 10.5.8上。显示器是NVIDIA GeForce 9400. – Bogdan 2011-06-08 13:55:18

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