确定,
这是我第一次尝试使用这样的着色器。我有一个正在运行的程序,它使用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
等等)答案 0 :(得分:3)
每次调用该函数(第一个代码)时,是否正在编译着色器?