在shadertoy等网络工具中,我的片段着色器源包含在我无法控制或看到的main()中。如果我分发一些GLSL库,情况就会一样。
我的问题是确保webGL2和1之间的兼容性:如果浏览器或操作系统只支持WebGL1,我想编写GLSL后备来模拟内置的缺少的webGL2。 - > 有没有办法从着色器测试当前的webGL / GLSL版本,就像扩展的可用性一样?
(顺便说一下,测试扩展现在变得越来越复杂了,因为有些语言包含在语言中:例如,尽管功能已经存在,但在webGL2中GL_EXT_shader_texture_lod未定义。因此能够测试GLSL版本至关重要。)
答案 0 :(得分:1)
AFAICT没有好的测试方法。规范说明预处理器宏.table {
display: table;
}
.table > div {
display: table-cell;
text-align: center;
}
将被设置为GLSL版本3.00的整数__VERSION__
中的版本,所以
300
当使用300个着色器时,问题出在WebGL2上,着色器的第一行必须是
#if __VERSION__ == 300
// use 300 es stuff
#else
// use 100 es tuff
#endif
所以你不能这样做
#version 300 es
因此,鉴于您已经必须更新第一行,为什么不只有2个着色器,一个用于WebGL1,另一个用于WebGL2。否则所有主要引擎都会生成着色器,因此如果你想沿着这条路走下去,那么在代码中生成WebGL1或WebGL2应该是非常简单的。
首先,如果您可以使用WebGl1,并且如果您使用的是WebGL2功能,则没有理由使用WebGL2着色器功能,那么它们不再是真正相同的着色器吗?他们需要不同的设置,不同的输入等......
让我们假装我们可以在GLSL中完成所有这些,你想要它看起来像什么?
#if IMAGINARY_WEBGL2_FLAG
#version 300 es // BAD!! This has to be the first line
...
#else
...
#
我们假设你想这样做。你可以用JavaScript做(不建议这样做,只是展示一个例子)
// IMAGINARY WHAT IF EXAMPLE ....
#if WEBGL2
#version 300 es
#define texture2D texture
#define textureCube texture
#else
#define in varying
#define out varying
#endif
in vec4 position;
in vec2 texcoord;
out vec2 v_texcoord;
uniform sampler2D u_tex;
uniform mat4 u_matrix;
void main() {
gl_Position = u_matrix * (position + texture2D(u_tex, texcoord));
v_texcoord = texcoord;
}
您可以根据需要使JavaScript替换变得复杂。例如this library