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如上所述非常低。
- 此绘图序列是否正确?还有其他的事情,当启用可能与着色器冲突? (
GL_LIGHTNING
,GL_DEPTH_TEST
等等)
答
您是否在每次调用该函数(第一个代码)时编译着色器?
着色器看起来很合理,因为它是一个简单的通过着色器,它实际上应该比固定函数更快。顺便说一句,只要使用通常的属性('glVertex/glVertexPointer','glNormal/glNormalPointer',...)设置bultin'gl_Vertex','gl_Normal',...属性,这是他们的优势。 – 2011-06-08 10:38:02
正如Christian所言,着色器代码看起来很健全,就像你发布的其他东西一样......性能的下降绝对不是正常的。这是在运行什么硬件?性能的这种急剧下降可能意味着软件回退。 – 2011-06-08 12:56:08
它运行在MAC OS X 10.5.8上。显示器是NVIDIA GeForce 9400. – Bogdan 2011-06-08 13:55:18