¿Hay vida sin WebGL 2.0?

WebGL 2.0 se lanzó en 2017, trajo la pila de gráficos OpenGL ES 3.0 (2012) y parece que todos los navegadores modernos deberían haberlo admitido durante mucho tiempo. Sin embargo, hay rezagados entre los líderes, y los usuarios de Safari todavía (principios de 2021) se ven obligados a limitarse a las capacidades de WebGL 1.0, publicado en 2011 basado en OpenGL ES 2.0.





Los desarrolladores que se han encontrado con OpenGL ES 2.0 saben de primera mano lo limitada que es esta pila de gráficos. Las limitaciones de la interfaz del software reflejaban en gran medida la debilidad de las tarjetas gráficas móviles de esa época, por lo que la transición masiva de los dispositivos Android a OpenGL ES 3.0 hace unos años resultó muy útil, aunque comenzó con un serio retraso del vídeo de escritorio. tarjetas.





Las tecnologías de navegador resultaron ser aún más inertes, mientras que los dispositivos Android han soportado durante mucho tiempo OpenGL ES 3.2 con sombreadores computacionales, implementan soporte para Vulkan y los desarrolladores de estándares web están preparando WebGPU, un desarrollador común todavía tiene acceso al obsoleto WebGL 2.0 en ese momento. de publicación, e incluso Stone Age WebGL 1.0 ...





Recientemente, el motor gráfico C ++ de Open CASCADE Technology (OCCT) agregó compatibilidad con PBR (iluminación basada en la física) para el modelo de material de rugosidad del metal. El avance de glTF 2.0 , conocido como “JPEG para 3D”, ha llevado a la aparición de este modelo de material como estándar de intercambio entre motores gráficos.





PBR   / OpenGL 1.1. , PBR “” OpenGL 3.0 ( 2008 !) OpenGL ES 3.0.





( WebAssembly) - WebKit Safari WebGL 2.0! Safari macOS , iOS Apple. AppStore , WebKit, , Safari - AppStore .





, WebGL 1.0 , Apple , OpenGL ES 3.0 iOS .





, Safari , WebGL 2.0. , , - WebGL 2.0 iOS 14. , Emscripten, WebGL 2.0, OCCT PBR :





 function _glUniform4fv(location, count, value) {
   GL.validateGLObjectID(GL.uniforms, location, 'glUniform4fv', 'location');
   if (GL.currentContext.version >= 2) {
      // WebGL 2 provides new garbage-free entry points to call to WebGL.
      // Use those always when possible.
-     GLctx.uniform4fv(GL.uniforms[location], HEAPF32, value>>2, count*4);
-     return;
+     //GLctx.uniform4fv(GL.uniforms[location], HEAPF32, value>>2, count*4);
+     //return;
   }
...
      
      



-: OCCT PBR WebGL 1.0

, Safari - WebGL 2.0, - ( ). , PBR WebGL 2.0, , PBR WebGL 1.0 .





, , “” WebGL 1.0, PBR iPad WebGL. iPad ‘2020 (Apple A12 Bionic) iOS 14.4 / Safari:





EGLVersion: 1.4 Emscripten EGL
EGLVendor: Emscripten
EGLClientAPIs: OpenGL_ES
GLvendor: WebKit
GLdevice: WebKit WebGL
GLunmaskedVendor: Apple Inc.
GLunmaskedDevice: Apple GPU
GLversion: OpenGL ES 2.0 (WebGL 1.0)
GLSL: OpenGL ES GLSL ES 1.00 (WebGL GLSL ES 1.0 (1.0))
Max texture size: 16384
Max FBO dump size: 16384x16384
Max combined texture units: 32
Viewport: 1560x1080
GLextensions: GL_EXT_blend_minmax GL_EXT_sRGB GL_OES_texture_float
GL_OES_texture_half_float GL_OES_texture_half_float_linear
GL_OES_standard_derivatives GL_EXT_shader_texture_lod
GL_EXT_texture_filter_anisotropic GL_OES_vertex_array_object
GL_OES_element_index_uint GL_WEBGL_lose_context GL_WEBGL_compressed_texture_astc
GL_WEBGL_compressed_texture_etc GL_WEBGL_compressed_texture_etc1
GL_WEBKIT_WEBGL_compressed_texture_pvrtc GL_WEBGL_depth_texture
GL_ANGLE_instanced_arrays GL_WEBGL_debug_shaders GL_WEBGL_debug_renderer_info
GL_EXT_color_buffer_half_float
      
      



- , WebGL 1.0:





  • WebGL 2.0 Firefox.





    • webgl.enable-webgl2=false



      ” “about:config



      ”.





    • - WebGL 1.0, WebGL 1.0 WebGL 2.0.





    • JavaScript .





  • WebGL 2.0 Emscripten.





    • MAX_WEBGL_VERSION=1



      ”.





    • - WebGL 1.0.





    • JavaScript ( ).





  • Chromium “MAX_WEBGL_VERSION=1



    ”.





    • WebGL 1.0, - .





    • JavaScript ( ).





  • Draw Harness OpenGL ES, ANGLE.





    • OpenGL ES, .





    • vcaps -maxversion 2 0



      ” OpenGL ES 2.0 ( OpenGL ES 3.0).





    • , - WebGL .





  • Safari macOS.





    • - WebGL 1.0.





    • Apple M1 (ARM64) iPad, !





    • JavaScript .





  • Safari iOS.





    • - WebGL 1.0.





    • JavaScript .





- , , … . WebGL - OpenGL OpenGL ES , - , WebGL GLSL.





WebGL, ANGLE, OpenGL Metal Apple. CG NVIDIA , AMD , OpenGL Apple , GLSL 110 GLSL 120!





PBR WebGL 1.0 :





  • PBR - 128x128



    GL_RG32F



    GL_RG16F



    .





    • #1: GL_RG32F



      /GL_RG16F



      iPad + WebGL 1.0 ( GL_EXT_texture_rg ).





    • #2: GL_RGBA32F



      iPad + WebGL 1.0. iPad GL_OES_texture_float_linear, GL_OES_texture_float. , iPad GL_OES_texture_half_float_linear, .





    • #3: GL_RGBA16F



      OpenGL ES 3.0 / WebGL 2.0, WebGL 1.0 + GL_OES_texture_half_float .





  • PBR 9x1 GL_RGBA32F



    .





    • : GL_RGBA32F



      FBO iPad + WebGL 1.0. iPad WEBGL_color_buffer_float.





  • - PBR 512x512x6



    GL_RGBA8



    .





    • : iPad + WebGL 1.0 -, ( GL_OES_fbo_render_mipmap ).





  • PBR GLSL - , .





    • : textureCubeLod()



      GLSL 100 es



      , GL_EXT_shader_texture_lod iPad + WebGL 1.0.





  • PBR GLSL , %



    .





    • #1: %



      GLSL 100 es



      , mod()



      .





    • #2: GLSL 100 es



      .





    • #3: GLSL 100 es



      (non-constant index expressions).





  • sRGB .





    • #1: GL_EXT_sRGB iPad + WenGL 1.0, , - glGenerateMipmap()



      .





    • #2: - sRGB WebGL 2.0 (5 !).





- OpenGL. - glGetError()



, WebGL , . , GLSL , , .





GL_RGBA16F



WebGL 1.0 + GL_OES_texture_half_float  32 16 - C/C++ . OpenGL 3.0 OpenGL ES 3.0 , WebGL 1.0 . GL_RGBA32F



GL_RGBA16F



:





GL_RGBA32F



PBR, . , PBR 9x1 - OpenGL, … , : 9x3 GL_RGBA8



  ( RGB ), glReadPixels()



, GL_RGBA32F



.





- PBR , - - glCopyTexImage2D()



. , - , , .





textureCubeLod()



PBR , , WebGL 1.0 GL_EXT_shader_texture_lod, GLSL :





+#extension GL_EXT_shader_texture_lod : enable
+#define textureCubeLod textureCubeLodEXT
      
      



PBR , textureCubeLod()



textureCube()



, .. - :





GLSL 100 es



. %



mod()



, :





  • GLSL :

    > const float aSHBasisFuncCoeffs[9] = float[9] { 0.0, 1.0, 2.0, … };







    • uniform , C/C++ - , -, , , .





  • for(;;)



    . PBR , ():

    > uniform int uSamplesNum;

    > for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter) {}








    • , , , , - . GLSL 100 es



      - uniform



      . :

      > uniform int uSamplesNum;

      > int TheMaxSamples = 1024;

      > for (int aSampleIter = 0; aSampleIter < TheMaxSamples; ++aSampleIter) {

      >   if (aSampleIter >= uSamplesNum) { break; }

      > }








  • “Non-constant index expressions are disallowed”. PBR :

    > int anIndex = int(gl_FragCoord.x);

    > float aCoef = aSHCosCoeffs[anId] * aSHBasisFuncCoeffs[anId];








    • GLSL 100 es



      if/else.

      >  if  (anId == 0) { aCoef = aSHCosCoeffs[0] * aSHBasisFuncCoeffs[0]; }

      >  else if (anId == 1) { aCoef = aSHCosCoeffs[1] * aSHBasisFuncCoeffs[1]; }

      >  else if (anId == 2) { aCoef = aSHCosCoeffs[2] * aSHBasisFuncCoeffs[2]; }








GLSL 100 es



, . GLSL , , (trivially unrolled) , .. .





sRGB

sRGB . , WebGL 1.0 + GL_EXT_sRGB - -. sRGB , -. - ( ), PBR - .





WebGL 2.0, - sRGB , . - 2048x2048x6 5 ! OpenGL / OpenGL ES .





, WebGL - - WebGL sRGB, , - . , WebGL sRGB ( ), - , mip-map .





- PBR OCCT Safari iPad c WebGL 1.0. , (iPad ‘2020, Apple A12 SoC 2018 ), , Apple .





, WebGL 2.0 - - .





, Microsoft Internet Explorer Microsoft Edge Legacy ( -Chromium ) -, . - (Mozilla Firefox, Chromium, Safari/WebKit)  - , .





La estrategia de Apple de mantener el ecosistema iOS bajo el capó y evitar las decisiones de la competencia priva a los usuarios del sistema de su propia elección. Numerosos rumores indican que el cansado soporte experimental de WebKit para WebGL 2.0 está a punto de finalizar su soporte experimental (gracias en parte al cambio a la implementación de OpenGL ES por parte de la biblioteca ANGLE, que ha sido utilizada por otros navegadores durante mucho tiempo), aunque la línea de tiempo , como de costumbre, sigue siendo desconocido.





La publicación original en inglés se puede encontrar aquí .








All Articles