2012-07-11 20 views
5

OpenGL ESとOpenGL(Windows)のシェーダソースを同じにしたいと思います。これを行うために、カスタムデータ型を定義し、OpenGL ES関数のみを使用したいと考えています。 Windowsのシェーダ用OpenGL ESとOpenGL互換シェーダ

#define highp 
#define mediump 
#define lowp 

と、それは、OpenGL ESのためであるとして、シェーダを書く:

一つのアプローチは、定義することです。

他のアプローチは、OpenGL ESのために、このようなカスタムデータ型を定義することです

:Windowsの

#define hvec2 vec2 

ため

#define hvec2 highp vec2 

と、このようにあなたは何だと思いますが良いですか?この問題の他の解決策はありますか?

答えて

4

浮動小数点精度を媒体に変換する。 OpenGL ESフラグメントシェーダでは、浮動小数点値のデフォルト精度レベルはありません。つまり、浮動小数点宣言ごとに精度を指定するか、明示的にデフォルト精度を設定する必要があります。あなたのアプリケーションにとって意味がある場合は、代わりにlowpまたはhighpを使用することができます。詳細については

は、OpenGL ESシェーディング言語仕様のセクション4.5.3を参照してください。http://www.khronos.org/files/opengles_shading_language.pdf

あなたのシェーダの精度をより細かく制御する必要がある場合は、あなたの#defineアプローチでこのアプローチを混ぜることができます。

4

あなたは、この拡張は、OpenGL 3.xのから欠落しているのOpenGL ES 2.0の機能のサポートが追加さhttp://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

を使用することができますこれらの機能を有効にすると、アプリケーションをOpenGL ES 2.0からOpenGLに移植するプロセスが簡単になります。

precision mediump float; 

デフォルトを設定:私のソリューションは、両方のAPIと互換性のあるシェーダコードを記述、およびOpenGL ESにフラグメントシェーダソースコードをアップロードするときにだけ、次の行を付加することであった

+0

これはどのように動作するのですか?私は仕様を抜きにしましたが、GLSL ES(バージョン100)とGLSL(バージョン150)がどのように互換性があるかに関係するものは何も見つかりませんでした。 –

+0

将来の参考として、私は、ES2_compatibilityの下で、OpenGL 3.2>コンテキストがES 2.0シェーダに#version 100を上にロードできることを発見しました。 –

1

私はちょうどシェーダがWindows上で動作している場合、各シェーダの開始で次のように定義することにより、それを管理する:

#define lowp 
#define mediump 
#define highp 

追加私はシェーダにplattformが使用されている情報を与える(WINDOWS、モバイル、IOS)この方法で使用することができます:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

コメントの先頭部分を強調したupvote - 私は、精度の変更子を入れて、無関係なプラットフォームでそれらを破棄して、それらを含めないで、他の場所で性能が損なわれるよりもずっと価値があると思います。しかし、 '#ifdef GL_ES'(と'#ifndef')は条件付きでコンパイルするのが最も簡単な方法です。 – Tommy