有没有办法在着色器中测试GLSL-ES版本?

时间:2017-04-27 19:46:02

标签: webgl glsles webgl-extensions webgl2

shadertoy等网络工具中,我的片段着色器源包含在我无法控制或看到的main()中。如果我分发一些GLSL库,情况就会一样。

我的问题是确保webGL2和1之间的兼容性:如果浏览器或操作系统只支持WebGL1,我想编写GLSL后备来模拟内置的缺少的webGL2。 - > 有没有办法从着色器测试当前的webGL / GLSL版本,就像扩展的可用性一样?

(顺便说一下,测试扩展现在变得越来越复杂了,因为有些语言包含在语言中:例如,尽管功能已经存在,但在webGL2中GL_EXT_shader_texture_lod未定义。因此能够测试GLSL版本至关重要。)

1 个答案:

答案 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

相关问题