web-dev-qa-db-ja.com

OpenGL ES 2.0複数のプログラムまたは複数のシェーダーまたは何ですか?どのように機能しますか?

問題(TL; DR)

私の問題は、基本的に、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 ES 2.0 GLSL仕様全体を読んでください(どれも、それがどのように使用されることが意図されていたのかについては言及されていません。すべてがどのように組み合わされているかではなく、すべてが何をしていたかについてだけでした)。
  • シェーダーを少し変更しようとしました。

だから私はOpenGLのワークフローを理解するのに近いことを望んでいますが、まだそこにはいないようです。

編集:私は後でこれをよく見つけました:

アプリケーションがOpenGL ES 2.0用に作成されている場合は、アプリケーションがシーンをレンダリングするために必要なすべてのタスクを実行する多数のスイッチと条件付きの単一のシェーダーを作成しないでください。代わりに、それぞれが特定の集中的なタスクを実行する複数のシェーダープログラムをコンパイルします。

これは iOS OpenGL ES 2.0ガイドラインからです

55

複数のシェーダーを使用できますが、それらを切り替えるには非常にコストがかかる可能性があるため、シェーダーのすべてのオブジェクトを描画してから、次のシェーダーに切り替えて、そのオブジェクトを使用してすべてのオブジェクトを描画することをお勧めします。
シェーダーを切り替えるには、 glUseProgram() を呼び出します。

21
Jave