WebGL与OpenGL预处理器在同一图形堆栈上不同

dro*_*nus 2 preprocessor opengl-es glsl webgl

我只是通过Chrome使用GLSL编译器发现了一个有趣的效果.该声明

#define addf(index) if(weights[i+index]>0.) r+=weights[i+index]*f##index(p);
Run Code Online (Sandbox Code Playgroud)

没有编译说明

preprocessor command must not be preceded by any other statement in that line
Run Code Online (Sandbox Code Playgroud)

似乎##语法不受支持.但是,在同一平台(例如Linux 64bit,Nvidia GPU)上,相同的着色器编译并运行良好.为什么这个?我认为着色器编译器是GPU驱动程序堆栈的一部分,并且将在两种情况下使用.为什么这种不同的体验?

Tob*_*gel 11

实际上WebGL也被称为"用于Web的OpenGL ES 2.0",因此OpenGL存在一些差异.

WebGL规范(https://www.khronos.org/registry/webgl/specs/1.0/)告诉我们:"WebGL实现必须只接受符合OpenGL ES着色语言版本1.00的着色器."

展望GLSL ES 1.0规范(https://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf),我发现:

3.4节定义了预处理器,并指出"没有基于数字符号的运算符(没有#,#@,##等),也没有sizeof运算符."

所以无论浏览器的内部实现如何,都遵循标准:)