1

我的 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 之间尽可能兼容。

4

1 回答 1

1

OpenGL

v1.20.8 OpenGL GLSL 规范说“不”。第 3.1 节“基础。字符集”包含:

没有行继续符。

请参阅:http ://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf或 http://www.opengl.org/registry/doc/GLSLangSpec.1.50.09.pdf

嗯,是

在规范的更高版本 (v4.30.6) 中添加了对换行符的支持。请参阅: http ://www.opengl.org/registry/doc/GLSLangSpec.4.30.6.pdf 。我不清楚这是什么时候添加的。

像 ( ) 这样的旧“#version”指令#version 100似乎不会禁用行继续(至少在我的 Nvidia 桌面驱动程序上)。

OpenGL ES

不,也许

第 1.5 节“兼容性”说:

当与 OpenGL ES 2.0 API 一起使用时,在 GLSL ES 1.00 中支持行继续和注释中的 UTF-8 字符是可选的。但是,当 GLSL ES 1.00 着色器与 OpenGL ES 3.0 API 一起使用时,必须同时支持这两者。

http://www.khronos.org/registry/gles/specs/3.0/GLSL_ES_Specification_3.00.3.pdf

概括

较新的 GLSL 规范包括对行继续字符的支持,但实际上,对于显式版本化的着色器并没有禁用此支持。较旧的 GLSL 编译器可能不支持换行符,因此为了获得最大的兼容性,应避免使用它们。

于 2013-05-07T18:31:59.367 回答