6

サポートされていない拡張機能は使用できません。ドライバーはコンパイル エラーを返します。しかし、GLSL コードから直接拡張機能の可用性を確認できますか? このようなものはありますか?

#version XXX core
#if supported(EXT_some_extension)
#extension EXT_some_extension: enable
#endif

...

更新: NicolBolasの回答によると。はい、それも頭に浮かんだのですが、なぜかうまくいきません

#version 150 core
#extension ARB_explicit_attrib_location : enable
#ifdef ARB_explicit_attrib_location
#define useLayout layout(location = 2)
#else
#define useLayout  //thats an empty space
#endif

in vec2 in_Position;
useLayout in vec2 in_TextureCoord;
...

マクロ「useLayout」は常に空のスペースに設定されますが、条件なしでディレクティブのみを残した場合、#enableそれが使用されます (私のドライバーはそれをサポートしています)。拡張機能が定義されていないように見えます。それは別のものです (おそらく?) (#if defined(ARB_explicit_attrib_location)も機能しません)

4

2 に答える 2

20
#if supported(EXT_some_extension)
#extension GL_EXT_some_extension: enable
#endif

特定の拡張子を条件付きで使用するシェーダーを作成しようとしています。あなたがやろうとしていることを行う正しい方法はこれです:

#extension EXT_some_extension: enable

#ifdef GL_EXT_some_extension
//Code that uses the extension.
#endif //GL_EXT_some_extension

GLSL 機能を持つすべての OpenGL 拡張機能には、固有#defineのものがあります。また、enableフラグは、拡張機能が存在しない場合にのみ警告を発します。アクティブでない場合、#ifdefはトリガーされません。

于 2013-08-03T23:43:46.223 に答える
1
于 2013-08-03T23:24:58.037 に答える