OpenGLで描画を行う際、
glBeginよりも後にglMaterialfvを呼び出すと、
シェーダーを使用した際に色が設定されない。
シェーダーを使用しなかった場合は正しく描画されてしまうのが曲者である。
// NG
glUseProgram( shaderProgram );
glBegin( GL_POLYGON );
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red );
glVertex3f( 0.0, 0.0, 0.0 );
glVertex3f( 1.0, 0.0, 0.0 );
glVertex3f( 1.0, 1.0, 0.0 );
glVertex3f( 0.0, 1.0, 0.0 );
glEnd();
// OK
glUseProgram( shaderProgram );
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red );
glBegin( GL_POLYGON );
glVertex3f( 0.0, 0.0, 0.0 );
glVertex3f( 1.0, 0.0, 0.0 );
glVertex3f( 1.0, 1.0, 0.0 );
glVertex3f( 0.0, 1.0, 0.0 );
glEnd();
shaderProgramとredは書いていないが適切な変数だと思って頂きたい。
恐らく、glBeginの時点でGPUにカラー情報が渡され、後から変更できない為に、
このような挙動になっているのではないかと。
シェーダーを使用しない場合何故通ってしまうのかは不明。
描画するオブジェクトの種類によっては、
glBeginとglEndの間で普通にglMaterialfvを呼び出すオブジェクトもあるが、
そういったオブジェクトでglBeginとglEndの間でglMaterialfvを間で呼び出すと、
シェーダーを使用する際どうなるかは調べていないので不明。
もしかしたら環境によって挙動が異なる可能性すらある。
0 件のコメント:
コメントを投稿