私の問題は、基本的に、OpenGL ES 2.0が複数のシェーダーを作成して使用することをどのように期待しているのかわからないことです。または、人がそうすることが推奨されている/期待されている場合。
ここでの基本的な質問は次のとおりです。私がすべて同じ3DワールドにApple、光る岩、およびファジーメッシュを持ち、すべてが異なるシェーダープログラムで描画されているが、同じmvpMatrixを使用している場合、それらすべてをどのように使用するのでしょうか。同じOpenGLレンダリングで、私が書いた最も適切なシェーダーがすべて使用されますか?
したがって、Androidゲームの基本的なOpenGL ES 2.0プログラムを作成しました。これは、オブジェクトの輪郭を画面に描画できるという点で完全に機能します。しかし、それ以外には何もしません。シェーダーは次のようになります。
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
void main() {
gl_Position = uMVPMatrix * aPosition;
}
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
今ではかなり基本的です。これ以上進んでいないのは、1つのシェーダーを作成してすべての異なるオブジェクトに適用するのか、複数のシェーダーを使用するのかがわからないためです。複数の異なるオブジェクトを描画するために複数のシェーダーを使用することになっている場合、それを効率的に行うにはどうすればよいですか?
これは、OpenGL ES 2.0を日常的に使用するすべての人にとって基本的な知識である必要があると感じているので、誰かが私の質問に答えたり、正しい方向に向けたりしてくれることを期待しています。
私が持っています:
だから私はOpenGLのワークフローを理解するのに近いことを望んでいますが、まだそこにはいないようです。
編集:私は後でこれをよく見つけました:
アプリケーションがOpenGL ES 2.0用に作成されている場合は、アプリケーションがシーンをレンダリングするために必要なすべてのタスクを実行する多数のスイッチと条件付きの単一のシェーダーを作成しないでください。代わりに、それぞれが特定の集中的なタスクを実行する複数のシェーダープログラムをコンパイルします。
複数のシェーダーを使用できますが、それらを切り替えるには非常にコストがかかる可能性があるため、シェーダーのすべてのオブジェクトを描画してから、次のシェーダーに切り替えて、そのオブジェクトを使用してすべてのオブジェクトを描画することをお勧めします。
シェーダーを切り替えるには、 glUseProgram()
を呼び出します。