opengl-es - WebGL 与同一图形堆栈上的 OpenGL 预处理器不同

标签 opengl-es preprocessor glsl webgl

我刚刚通过 Chrome 使用 GLSL 编译器发现了一个有趣的效果。声明内容

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

不编译说明

preprocessor command must not be preceded by any other statement in that line

似乎不支持 ## 语法。 然而,在相同的平台(例如 Linux 64 位、Nvidia GPU)上,相同的着色器可以编译并运行良好。为什么这个?我认为着色器编译器是 GPU 驱动程序堆栈的一部分,并且在这两种情况下都会使用。那么为什么会有这种不同的体验呢?

最佳答案

实际上WebGL也被称为“OpenGL ES 2.0 for the Web”,因此与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 运算符。”

因此,无论浏览器的实现在内部做什么,它都遵循标准:)

关于opengl-es - WebGL 与同一图形堆栈上的 OpenGL 预处理器不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574919/

相关文章:

android - 将真实世界坐标映射到 OpenGL 坐标系

c++ - 检查预处理器符号的值(#define)

具有扩展宏和类型转换的 C 预处理器条件

c++ - 有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?

opengl - 未明确指定绑定(bind)点索引的多个 UBO

ios - 从 iOS 中的离屏 OpenGL 像素缓冲区读取像素 (OopenGL-ES)

ios - 某些 IOS 设备中的示例 GL_DEPTH24_STENCIL8 深度纹理错误

java - 使用libGdx桌面端口作为Android GLES20的模拟器

opengl - 不推荐使用 OpenGL 中的矩阵堆栈?

javascript - 那个过滤器叫什么?