我有一个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调用不会引起错误,它是在绑定空帧缓冲区之后将其设置为关闭状态。
答案 0 :(得分:1)
从版本83开始,Chrome开始对帧缓冲区和活动的纹理反馈循环执行保守检查。这些检查可能过于保守,会影响应实际允许的使用情况。
在这些新检查中,Chrome似乎不允许将渲染目标绑定到任何纹理插槽,即使程序未使用该插槽也是如此。
在2遍渲染中,您可能会遇到以下情况:
在1中,您可能需要使用gl.bindTexture(gl.TEXTURE_2D,yourTexture)绑定纹理,然后在步骤2之前,使用gl.bindTexture(gl.TEXTURE_2D,null)取消绑定纹理;否则,Chrome将会失败,因为即使目标纹理没有被程序采样,渲染目标也被绑定为纹理。