2011-12-01 7 views
6

OpenGL ES用にシェーダがコンパイルされていることをソースコード内でシェーダに伝える方法はありますか? #versionプリプロセッサディレクティブをOpenGL ES用に100(OpenGL ES 2.0用にシェーダをコンパイルするように)を使用して定義することができますが、OpenGL 2.1ではバージョン110です)。シェーダコード内でOpenGLバージョンがOpenGL ESであるかどうかを知ることはできますか?

#versionをアプリケーションレベルで供給される別の文字列として配置するには、これを行う最善の方法はありますか?それともシェーダー内でこれを行う方法はありますか?

もう1つの有用な関連することは、 #if version == 100というコードをコンパイルすると、elseというコードをコンパイルすることです。これはGLSL内で可能ですか?

ありがとうございました。

+1

Shaderを読み込み、OpenGL ESなら '#version 100'、そうでない場合は' #version 110'の前にCプログラムで見つけられませんでした。とにかくOpenGLをシェーダを文字列として渡す必要があるので、Cでバージョン処理をしないでください。 – PeterT

+0

そう、私はそれが私がやらなければならないことだと思っていました! –

答えて

5

上記のコメントでPeterTとして提案されているメインプログラムの#versionは、の方法でしか動作しません。これを行うことができること(そして-Dコンパイラスイッチのようなものを持たずに定数を定義できること)は、char*ではなくポインタの配列をとってglShaderSourceの主な目的です。

GLSL仕様(3.3章)では、空白とコメントを除き、#versionがシェーダソースの最初のものであることが必要です。

したがって、

#ifdef foo 
    #version 123 
#endif 

のようなものが有効でない、及び(シェーダコンパイラが過度に寛容でなければ、すなわち破壊)なものはコンパイルしないであろう。

2番目の質問については、条件付きコンパイルが確実に機能し、意図したとおりに使用することは良いことです。

+0

素晴らしいです - ありがとう! :) –

+0

Kkので、私はそれをやって始めて、それは本当にうまくいくようです。唯一のことは、 '#if version == 100'を使ってバージョンを確認することを提案しましたが、代わりに組み込みの値' __VERSION__'を使うべきです。そうすれば '#if __VERSION__ == 100'となります。 –