OpenGL(和OpenGL ES)支持预处理器“行延续”吗?字符



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

OpenGL

没有

v1.20.8 OpenGL GLSL规范说"No"。第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节"兼容性"规定:

支持行延续和支持UTF-8字符当与OpenGL ES 2.0一起使用时,注释在GLSL ES 1.00中是可选的API。但是,在使用GLSL ES时,必须支持这两种方法1.00 shader与OpenGL ES 3.0 API一起使用。

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

总结

较新的GLSL规范包括对行延续字符的支持,但在实践中,对于显式版本的着色器,这种支持并没有被禁用。旧的GLSL编译器可能不支持行连续字符,因此为了获得最大的兼容性,应该避免使用它们。

最新更新