【问题标题】:WebGL feedback loop formed between Framebuffer and active TextureFramebuffer和活动Texture之间形成的WebGL反馈循环
【发布时间】:2020-09-16 08:46:40
【问题描述】:

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

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

[.WebGL-0000020DB7FB7E40] GL_INVALID_OPERATION: Feedback loop formed between Framebuffer and active Texture. 

即使我没有更改我的代码,这种情况才刚刚开始发生,所以我猜是新的更新导致了这种情况。

我在 SO 上找到 this answer,指出错误“在您从当前附加到帧缓冲区的纹理中读取时发生”。

但是我已经梳理了我的代码 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 pass处理”。

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

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 调用不会导致错误,它会绑定空帧缓冲区,然后将其设置为关闭。

【问题讨论】:

  • 您需要显示更多代码,但您发布的代码可能有反馈循环。您创建的最后一个纹理是 texture1,所以它仍然是绑定的。将其附加到帧缓冲区。然后你画。如果您的着色器使用纹理,它看起来肯定会同时尝试从纹理 1 读取和从纹理 1 写入。
  • 也许我误解了它的工作原理,但我的着色器不能只从采样器中读取纹理。那么纹理0绑定到采样器我怎么能从纹理1中读取呢?我知道纹理 1 仍然是活动纹理,我认为它必须将它绑定到帧缓冲区。绑定后我应该让它“非活动”吗?
  • @gman,也请参阅我的编辑。不知道为什么,但似乎在绘制调用之后绑定空帧缓冲区是导致错误的原因。
  • 我很确定这实际上是由绑定采样器跟踪的 libANGLE 实现损坏引起的。一旦纹理被绑定为采样器,即使它在之后未绑定,浏览器也会认为它正在被使用。该更改已实施in this commit,并且还有一些修复;它似乎在最新的 Canary 中工作。
  • 投票结束。你还没有输入mininal-reproducable-example。请添加一个

标签: webgl


【解决方案1】:

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

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

在您的 2 遍渲染中,您可能有类似的内容:

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

在 1 中,您可能使用 gl.bindTexture(gl.TEXTURE_2D, yourTexture) 绑定纹理,然后在步骤 2 之前,使用 gl.bindTexture(gl.TEXTURE_2D, null); 取消绑定纹理;否则 Chrome 将失败,因为渲染目标被绑定为纹理,即使该纹理未被程序采样。

【讨论】:

  • 这只是 Chrome 中的一个明显错误:bugs.chromium.org/p/angleproject/issues/detail?id=4638 希望他们能尽快修复。您可以解决它,也可以等待几天。
  • @gman 感谢您提供错误报告的链接。您知道将修复推送到 Chrome 的发布版本之前或多或少吗?我们需要等待84版吗?该错误会影响我们的生产系统,但在我们的案例中,添加解决方法并非易事。
  • 我不知道,但同样的错误会影响 Google 地图,所以我假设它可能是修复的优先事项
  • 谢谢,这正是发生在我身上的事情。您的修复成功了,很高兴知道它将在未来版本的 chrome 中修复。
  • 我的 Firefox 似乎正在发生一些“奇怪/新”的事情。通过明确指定 READ_FRAMEBUFFER 默认为 DRAW 来修复它。我认为将默认帧缓冲区设置为绘制模式 ANGEL 抱怨同一个对象上的 2 个写调用。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多