iPhone中的WEBGL_depth_texture精度太低

时间:2016-02-21 05:03:25

标签: iphone webgl opengl-es-2.0

最近,我尝试在WebGL中为移动浏览器制作延迟渲染器。 要制作延迟渲染器,我需要将场景对象的深度渲染到纹理中一次。 我知道在渲染场景对象的深度时,我可以将深度值打包到UBYTE RGBA纹理中。

但是,我知道iPhone支持WEBGL_depth_texture。所以,现在我想使用该功能而不是使用UBYTE RGBA。

当我在PC浏览器中调试渲染器时,这很有效,但在iPhone浏览器中深度纹理的精度太低。

这是从渲染深度纹理渲染到UBYTE RGBA中的这些深度纹理。 正确的深度纹理图像(PC浏览器) PC 深度纹理图像不正确(iPhone safari / chrome) iPhone

而且,Mac中的模拟器生成了与PC浏览器相同的图像。

这是我用来获取深度纹理像素并渲染为UBYTE RGBA纹理的代码。

    vec3 packUNorm24(const highp float value){
      const vec3 bitSh = vec3(256.0*256.0, 256.0, 1.0);
      const vec3 bitMsk = vec3(0.0, 1.0/256.0, 1.0/256.0);
      vec3 highp res = fract(value * bitSh);
      res -= res.xxy * bitMsk;
      return res;
     }

    vec3 packRanged24(const highp float value,const highp float minimum,const highp float maximum){
      return packUNorm24((value - minimum)/(maximum - minimum));
    }

    uniform sampler2D _depthBuffer;
    void main(void)
    {
      gl_FragColor.rgb = packRanged24(texture2D(_depthBuffer,uv).r,-1.,1.);
      gl_FragColor.a = 1.;
    }

为什么这些精度太低?

1 个答案:

答案 0 :(得分:3)

我认为WEBGL_Depth_Texture规范(https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)允许实现决定16,24或32位深度值。

虽然精度可能太低而无法满足您的需求,但如果iPhone实现选择16位且桌面实现选择24位或更高,我认为这是不正确的。

  

根据OpenGL ES规范,无法保证OpenGL ES实现将使用纹理类型来确定如何在内部存储深度纹理。它可以选择将32位深度值下采样为16位甚至24位。