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

时间:2020-05-28 21:27:12

标签: webgl

我有一个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绑定到采样器,从而开始“两遍处理”。

然后我绑定帧缓冲区并调用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调用不会引起错误,它是在绑定空帧缓冲区之后将其设置为关闭状态。

1 个答案:

答案 0 :(得分:1)

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

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

在2遍渲染中,您可能会遇到以下情况:

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

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

相关问题