最近,我尝试在WebGL中为移动浏览器制作延迟渲染器。 要制作延迟渲染器,我需要将场景对象的深度渲染到纹理中一次。 我知道在渲染场景对象的深度时,我可以将深度值打包到UBYTE RGBA纹理中。
但是,我知道iPhone支持WEBGL_depth_texture。所以,现在我想使用该功能而不是使用UBYTE RGBA。
当我在PC浏览器中调试渲染器时,这很有效,但在iPhone浏览器中深度纹理的精度太低。
这是从渲染深度纹理渲染到UBYTE RGBA中的这些深度纹理。 正确的深度纹理图像(PC浏览器) 深度纹理图像不正确(iPhone safari / chrome)
而且,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.;
}
为什么这些精度太低?
答案 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位。