31

2つの質問は本当に...

  1. GLSL ES 2 は完全に独立した言語ですか、それとも GLSL の特別なバージョンですか?
  2. 「標準ライブラリ」関数、構文、および機能に関して、それらの違いは何ですか?

Windows、Mac、および iPad をターゲットとするアプリケーション用のシェーダーを作成していますが、各シェーダーのバージョンを追加する必要はありません。とにかく単純なシェーダーです。

4

2 に答える 2

27

GLSL ES 2は完全に別の言語ですか、それともGLSLの特別なバージョンですか?

GLSLのすべてのバージョンは、最終的には「完全に別個の言語」です。以前のバージョンとの下位互換性がないものもあります。ただし、GLSLのESバリエーションはさらに重要です。

デスクトップGLSLのフォークと考えてください。6バージョン前のGLSLのフォークです。

「標準ライブラリ」の機能、構文、機能の点で、それらの違いは何ですか?

どのバージョン間ですか?

これらのプラットフォーム間でシェーダーを共有しようとしている可能性がある唯一の理由は、プラットフォーム間でOpenGLコードを共有しようとしている場合です。したがって、デスクトップのOpenGL2.1機能に制限する必要があります。

つまり、デスクトップGLSLバージョン1.20を使用することになります。これは、GLSL ESバージョン1.00(GLSLのバージョンには対応するGLバージョンと同じ番号が付けられていません。デスクトップGL 3.3/4.0およびGLSL3.30/ 4.00まで)に似ていますが、それでも異なります。ESには、デスクトップGLSL1.20では処理できない多くの高精度修飾子があります。

これを処理する最良の方法は、「プリアンブル」シェーダー文字列を使用することです。を参照してください。glShaderSource複数のシェーダー文字列を取得し、それらを一緒に叩いて1つにコンパイルします。メインのシェーダー文字列(mainおよびそのさまざまなコード、attribute定義uniformsなど)を取得し、その前に「プリアンブル」シェーダー文字列を貼り付けることができます。プリアンブルは、コンパイル対象によって異なります。

ESGLSL1.00プリアンブルは次のようになります。

#version 100  //Must start with a version specifier.

デスクトップGLSL1.20プリアンブルは次のようになります。

#version 120
#define lowp
#define mediump
#define highp

そして多分他のいくつかの賢明な#defines#defineこのようにして、シェーダーにこれらの高精度修飾子を設定でき、デスクトップGLSLを使用するときにそれらが削除されます。

これは、C / C ++のプラットフォームに依存しないコーディングによく似ており、定義を変更したり、#defineコードを条件付けできるプラットフォーム固有のヘッダーを使用したりすることがよくあります。

于 2012-04-30T21:41:23.593 に答える