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
)