在Framebuffer和活动的Texture之间形成WebGL反馈环。

问题描述 投票:2回答:1

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

一切都很正常,直到最近chrome开始抛出这个错误。

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

虽然我没有修改代码,但这是刚开始发生的, 所以我猜测是新的更新造成的。

我发现 本回答 上的错误,说 "当你从一个当前连接到framebuffer的纹理读取时,错误就会发生"。

然而,我已经梳理了我的代码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();

然后我开始 "2次处理",将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调用并没有导致错误,而是在之后绑定null帧缓冲区才引发了错误。

webgl
1个回答
1
投票

自83版以来,Chrome开始对framebuffer和活动纹理反馈循环进行保守的检查。这些检查可能过于保守,影响了实际应该允许的使用。

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

在你的 2 pass 渲染中,你可能有这样的情况。

  1. Initialize a render target and create a texture that points to a frameebuffer. 初始化一个渲染目标 并创建一个指向帧缓冲区的纹理
  2. 渲染到目标。

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

© www.soinside.com 2019 - 2024. All rights reserved.