OpenGL ES フラグメント シェーダーに、次のようなマクロがあります。
#define CHECK(x, DELTA, outColor, c1, c2) \
if (x < (delta + (DELTA))) { \
outColor = mix(c1, c2, smoothstep(delta, min(1.0, delta + (DELTA)), x)); \
x = 10.0; /*skip all subsequent CHECKs */ \
} \
delta += DELTA;
これは、私のデスクトップやさまざまな Android デバイスで問題なく動作します。(ええ、明示的なフロー制御から離れる必要がありますが、今のところ必要な出力が得られます。) 問題は、いくつかのデバイスがこのシェーダーのコンパイルに失敗し、次のようなエラーが発生することです。
0:257: L0002: Undeclared variable 'DELTA'
,0:260: L0001: Expected literal or '(', got '\'
,0:263: L0001: Expected literal or '('...
(ライン 257 は"if ( x"
ライン、ライン 260 は"} \"
ラインであり、263 はここには示されていませんCHECK
。マクロの最初の使用です。シェーダーの他の場所には、すべて大文字の「DELTA」の他のインスタンスはありません。)
このエラーは、行継続文字でつまずいていることを意味していると思いますか? これは本当に一部の GLSL コンパイラだけがサポートするものですか?
#version 100
デスクトップと Android の間で可能な限り互換性を持たせるために、シェーダーを構築しています。