2つの質問は本当に...
- GLSL ES 2 は完全に独立した言語ですか、それとも GLSL の特別なバージョンですか?
- 「標準ライブラリ」関数、構文、および機能に関して、それらの違いは何ですか?
Windows、Mac、および iPad をターゲットとするアプリケーション用のシェーダーを作成していますが、各シェーダーのバージョンを追加する必要はありません。とにかく単純なシェーダーです。
2つの質問は本当に...
Windows、Mac、および iPad をターゲットとするアプリケーション用のシェーダーを作成していますが、各シェーダーのバージョンを追加する必要はありません。とにかく単純なシェーダーです。
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
コードを条件付けできるプラットフォーム固有のヘッダーを使用したりすることがよくあります。