Javascript 帧缓冲区\u不完整\u附件仅在Android w/Firefox上发生

Javascript 帧缓冲区\u不完整\u附件仅在Android w/Firefox上发生,javascript,cross-browser,webgl,framebuffer,Javascript,Cross Browser,Webgl,Framebuffer,我有一些javascript/webgl代码,可以在我尝试过的所有浏览器上运行,除了Android上运行的移动版firefox。这个问题与“”有关,但我不知道具体错在哪里 这是我能做的最小的修改。只需创建纹理和帧缓冲区,设置一些属性,然后检查帧缓冲区是否“完整”: var canvas=document.createElement('canvas'); var gl=canvas.getContext('webgl'); var GL=WebGLRenderingContext; if(gl.

我有一些javascript/webgl代码,可以在我尝试过的所有浏览器上运行,除了Android上运行的移动版firefox。这个问题与“”有关,但我不知道具体错在哪里

这是我能做的最小的修改。只需创建纹理和帧缓冲区,设置一些属性,然后检查帧缓冲区是否“完整”:

var canvas=document.createElement('canvas');
var gl=canvas.getContext('webgl');
var GL=WebGLRenderingContext;
if(gl.getExtension('OES\u texture\u float')==null){
警报(“无浮动支持”);
}
var texture=gl.createTexture();
var frameBuffer=gl.createFramebuffer();
gl.bindTexture(gl.TEXTURE_2D,纹理);
gl.bindFramebuffer(gl.FRAMEBUFFER,FRAMEBUFFER);
gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MAG\u过滤器,gl.NEAREST);
gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MIN\u过滤器,gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D、gl.TEXTURE_WRAP_S、gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE\u 2D、gl.TEXTURE\u WRAP\u T、gl.CLAMP\u至边缘);
gl.texImage2D(
GL.TEXTURE_2D,//目标
0,//级别
GL.RGBA,//内部格式
2,//宽度
2,//高度
0,//边框
GL.RGBA,//格式
GL.FLOAT,//类型[更改为无符号字节“修复”故障…?]
空//像素
);
gl.framebufferTexture2D(
GL.FRAMEBUFFER,
GL.COLOR_附件0,
GL.U 2D,
纹理
0);
var result=gl.checkFramebufferStatus(gl.FRAMEBUFFER);
如果(结果===GL.FRAMEBUFFER\u完成){
警报(“成功(帧缓冲区_完成)”;
}否则{
警报(“错误”+({
[0]:“参数不是帧缓冲区”,
[GL.无效枚举]:“无效枚举”,
[GL.FRAMEBUFFER\u未完成\u附件]:“FRAMEBUFFER\u未完成\u附件”,
[GL.帧缓冲区\u不完整\u缺少\u附件]:
“帧缓冲区\u不完整\u缺少\u附件”,
[GL.FRAMEBUFFER\u未完成\u维度]:“FRAMEBUFFER\u未完成\u维度”,
[GL.FRAMEBUFFER\u不支持]:“FRAMEBUFFER\u不支持”
}[结果]| |结果];

}
如果它在其他浏览器中的同一部手机上运行,我会选择

不过,一般来说,将浮点纹理附加到帧缓冲区的功能并不普遍受支持。在OpenGL ES 2.0中,任何格式都不能保证工作:(

在WebGL中,只有3种格式可以保证工作:

当所有附件都是帧缓冲区附件完整、非零且具有相同的宽度和高度时,帧缓冲区对象附件的以下组合必须导致帧缓冲区完整:

  • 颜色\u附件0=RGBA/无符号\u字节纹理
  • 颜色\附件0=RGBA/无符号\字节纹理+深度\附件=深度\组件16渲染缓冲
  • 颜色\附件0=RGBA/无符号\字节纹理+深度\模具\附件=深度\模具渲染缓冲

所有其他附件组合由GPU/驱动程序/浏览器决定。

您需要检查是否
gl.getExtension('OES\u texture\u float'));
返回非null以查看该功能是否受支持。没有任何重载接受帧缓冲区对象作为参数,应该用
gl.framebuffer
独占调用它,并检查当前绑定的帧缓冲区。您是否检查了
OES_texture_float
扩展是否实际受支持?@WacławJasper我从复制中删除了该检查,因为它在我测试的所有浏览器(包括firefox+android)上都返回非空。我将该检查放回,因为忽略它会造成混乱。firefox的移动版本在上一次测试中似乎没有通过大量的一致性测试。可能是浏览器中的一个bug?
OES_texture_float
扩展(参见概述部分的最后一点)你可以渲染浮点纹理。这就是为什么应该引入它,但它很少实现,唯一确保的方法是检查帧缓冲区状态,就像你已经做的那样。如果只允许浮动字节,人们如何进行涉及浮动的多步GPU计算?他们只是保持手动打包和解包吗在两个步骤之间对它们进行打包?它在完全相同的手机上的Chrome中也能工作,所以我将提交一个bug。它们要么打包/解包,要么只在支持浮动的设备/浏览器上运行