OpenGL を使用したテクスチャのレンダリングで問題が発生しています。最初にテクスチャをレンダリングし、次に正方形をレンダリングします。私が使用する正方形の色を設定するにはglColor3f(1.0f,0.0f,0.0f);
、これにより正方形が赤くなります。しかし、テクスチャが再度レンダリングされると、赤色でもレンダリングされます。
ここで何が問題なのですか?
を呼び出すと、将来のすべての描画呼び出しに対してglColor
一定の色が設定されます。開始時の状態に戻したい場合は、正方形を描いた後に明示的に元に戻す必要があります。
通常 (テクスチャ環境によって異なります)、頂点カラーと定数カラーは頂点シェーディング中に結合され、補間され、後でフラグメント シェーディングのテクセル カラーに対して乗算されます。
を使用するglColor3f(1,0,0)
と、テクスチャの赤チャンネルに 1.0 を乗算し、緑と青のチャンネルに 0.0 を掛けることになるため、テクスチャの赤チャンネルのみが得られます。
通常のテクスチャ カラーを表示するには、定数カラーを 1,1,1 にリセットする必要があります。
一般的に言えば、事前にすべての一般的な gl 状態を設定しておき、珍しい変更が必要なものを描画した後にその状態に「戻る」ことをお勧めします。これは「ゼロ状態」と呼ばれることもあります。また、多くのパフォーマンス チューニングの文献では、同様のまれな非ゼロ状態のニーズを持つものをまとめてバッチ処理することが提案されていることにも注意してください。これは、グラフィックス ドライバー、ハードウェアなどによって効果がある場合とない場合があります。
ここでの「問題」は、(a) デフォルトでは、opengl は GL_MODULATE texenv モードを使用するため、フラグメントの色にテクスチャの色を乗算して最終的な色を生成し、(b) openGL がステート マシンであることです。したがって、他の色を設定している限り、赤色はそのままです。
ライティングを使用する場合、GL_MODULATE は、ライティング計算の結果をテクスチャ カラーと組み合わせるのに非常に便利です。
テクスチャだけが必要な場合は、テクスチャ オブジェクトを描画する前に白色を指定するか、GL_REPLACE などの別のテクスチャ環境モードを使用します。
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
その機能と利用可能なモードとオプションの説明については、glTexEnvのマンページをご覧ください。