在帧缓冲区和活动纹理之间形成WebGL反馈循环

在帧缓冲区和活动纹理之间形成WebGL反馈循环,webgl,Webgl,我有一个webgl项目设置,它使用两次渲染在纹理上创建效果 一切正常,直到最近chrome开始抛出以下错误: [.WebGL-0000020DB7FB7E40] GL_INVALID_OPERATION: Feedback loop formed between Framebuffer and active Texture. 虽然我没有更改代码,但这种情况刚刚开始发生,所以我猜是一个新的更新导致了这种情况 我发现是这样的,说明错误“在您从当前附加到帧缓冲区的纹理读取时发生” 然而,我已经梳理

我有一个webgl项目设置,它使用两次渲染在纹理上创建效果

一切正常,直到最近chrome开始抛出以下错误:

[.WebGL-0000020DB7FB7E40] GL_INVALID_OPERATION: Feedback loop formed between Framebuffer and active Texture. 
虽然我没有更改代码,但这种情况刚刚开始发生,所以我猜是一个新的更新导致了这种情况

我发现是这样的,说明错误“在您从当前附加到帧缓冲区的纹理读取时发生”

然而,我已经梳理了我的代码100次,我不相信我正在这样做。下面是我如何设置的

使用统一采样器创建片段着色器

uniform sampler2D sampler;
创建2个纹理

var texture0 = initTexture(); // This function does all the work to create a texture 
var texture1 = initTexture(); // This function does all the work to create a texture 
创建一个帧缓冲区

var frameBuffer = gl.createFramebuffer();
然后,我通过将html图像上传到texture0并将texture0绑定到采样器来启动“2遍处理”

然后绑定帧缓冲区并调用drawArray:

gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture1, 0);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
要清除,请取消绑定帧缓冲区:

gl.bindFramebuffer(gl.FRAMEBUFFER, null);
编辑:


在向代码中添加断点之后,我发现在绑定空帧缓冲区之前,实际上不会抛出错误。因此,drawArrays调用没有导致错误,它是在绑定空帧缓冲区之后将其设置为禁用状态。

Chrome自版本83开始对帧缓冲区和活动纹理反馈循环执行保守检查。这些检查可能过于保守,影响实际允许的使用

在这些新检查中,Chrome似乎不允许将渲染目标绑定到任何纹理槽,即使程序未使用该槽

在2遍渲染中,可能会出现以下情况:

  • 初始化渲染目标并创建指向帧缓冲区的纹理
  • 渲染到目标

  • 在1中,您可能使用gl.bindTexture(gl.texture_2D,yourTexture)绑定纹理,然后在步骤2之前,需要使用gl.bindTexture(gl.texture_2D,null)解除绑定纹理;否则Chrome将失败,因为渲染目标绑定为纹理,即使程序未对该纹理进行采样。

    您需要显示更多代码,但您发布的代码可能有一个反馈循环。您创建的上一个纹理是texture1,因此它仍然处于绑定状态。将其附加到帧缓冲区。然后你画。如果你的着色器使用纹理,它看起来肯定是在试图同时从texture1读取和从texture1写入。也许我误解了它的工作原理,但我的着色器不能仅从采样器读取纹理。那么,当texture0绑定到采样器时,我怎么能从texture1中读取呢?我知道texture1仍然是活动纹理,我认为必须将其绑定到帧缓冲区。我应该在绑定后将其设置为“非活动”吗?@gman,也请查看我的编辑。不知道为什么,但似乎是在draw调用后绑定空帧缓冲区导致了错误。我很确定这实际上是由绑定采样器跟踪的libANGLE实现中断引起的。一旦将纹理绑定为采样器,即使之后立即解除绑定,浏览器也会认为它正在使用。这一改变已经实施,并且还有一些修正;它似乎在最近的金丝雀中起作用。投票结束。你还没有放一个。请添加一个。这只是Chrome中的一个完全错误:希望他们能尽快修复。您可以解决这个问题,也可以等几天。@gman感谢您提供错误报告的链接。你知道修复程序发布到Chrome版本的时间长短吗?我们需要等待版本84吗?这个错误影响了我们的生产系统,但在我们的情况下,解决方法是非常重要的。我不知道,但同样的错误影响了谷歌地图,所以我想这可能是一个优先解决的问题。谢谢你,这正是发生在我身上的事情。你的修复成功了,很高兴知道它将在chrome的未来版本中得到修复。我的Firefox似乎出现了一些“奇怪/新”的问题。通过显式指定READ_帧缓冲区默认值为绘图来修复此问题。我认为,如果将默认帧缓冲区设置为draw mode,ANGEL会在同一对象上抱怨大约2个writecalls。