Opengl es WebGL不同于同一图形堆栈上的OpenGL预处理器

Opengl es WebGL不同于同一图形堆栈上的OpenGL预处理器,opengl-es,preprocessor,glsl,webgl,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),相同的着色

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规范()告诉我们: WebGL实现必须只接受符合OpenGL ES着色语言1.00版的着色器

查看GLSL ES 1.0规范()我发现:

第3.4节定义了预处理器,并指出“不存在基于数字符号的运算符(no#、#@、##等),也不存在sizeof运算符。”


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

WebGL实现需要符合WebGL规范。安全问题需要许多限制。根据WebGL规范,
#
问题不是,但无论如何都不正确

为了符合要求,他们可以使用完全符合要求的图形堆栈(例如,如果驱动程序显示未扩展的OpenGL ES配置文件,则为其提供包装),或者在将comamnds传递给某个完整的OpenGL实现之前,预检查GLSL着色器代码和WebGL状态本身以确保符合要求


因此,WebGL行为可能不同于同一台机器上的本机OpenGL行为

这是因为在Windows上,Chrome默认不使用OpenGL驱动程序。它使用Direct3D,由项目完成从OpenGL到Direct3D的转换


ANGLE有自己的着色器验证器和预处理器。因此,即使使用相同的硬件,您也可以看到Windows和其他操作系统之间的差异。之所以创建ANGLE,是因为在Windows上,Direct3D支持通常比OpenGL支持好得多,而且它允许对实现及其一致性进行更多的控制。

“它遵循标准”。。我同意。还是很奇怪它是怎么做到的。。。这些操作符被排除在外。特别是,如果英伟达的驱动程序实际上也在桌面平台上实现OpenGL ES,那么如果使用了真正的OpenGL ES堆栈,那么如果你已经知道它实际上正确地遵循了标准,那么,NVIDIA驱动程序实际上也可以实现OpenGL ES。最好纠正上面的错误说法,即这是Chrome的GLSL编译器中的一个bug。除此之外,我会修正这个问题。这被误解了,我不认为Chrome的GLSL编译器中有bug,因为我认为GPU厂商的驱动程序堆栈中只有一个编译器。然而,似乎有不止一个(或者说有更多的配置文件),但这些配置文件可能仍在供应商堆栈中。我面临的问题根本不是WebGL bug,因为WebGL规范明确禁止使用
##
操作符。然而,我仍然想知道这种不同的行为是如何发生的,因为我仍然不确定Chrome是如何实现这个错误的,而其他GL应用程序不会触发它。好的,我不明白“Chrome使用的WebGL GLSL编译器中的bug”怎么不意味着“Chrome的GLSL编译器中的bug”也许对比的问题在于编译器是否是Chrome的?但不管怎样,你已经删除了措辞。。。谢谢+1所有WebGL实施(Opera、WebKit、Firefox、Chrome)都需要执行这些限制。为此,他们在将GLSL着色器传递给GPU驱动程序之前验证它们。WebKit、Firefox和Chrome都使用相同的验证器。歌剧有自己的风格。有一些WebGL一致性测试测试这些验证器是否强制执行这些限制。强制它们的原因是为了尽可能防止着色器在一个驱动程序或设备上工作,而不是在另一个驱动程序或设备上工作。确定。这意味着Chrome可能正在我的系统上使用普通的OpenGL堆栈(而不是OpenGL ES,因为我想知道桌面驱动程序是否提供了它),但我将其归因于OpenGL驱动程序本身的预检查。好吧,他们终于从官方的OpenGL着色器日志中出来了……这实际上合并了Tobias Schlegel的答案和gman的评论。谢谢你们两位!这也许可以解释在Windows平台上的这种体验,但我首先在一台完全支持OpenGL的Linux机器上面对这种影响。