cocos 2.2.1 截图后更新精灵贴图警告报错 [.WebGL-0000026CBBD48AA0] GL_INVALID_OPERATION: Feedback loop formed between Framebuffer and active Texture

Cocos 2.2.1 一直在报
[.WebGL-0000026CBBD48AA0] GL_INVALID_OPERATION: Feedback loop formed between Framebuffer and active Texture

代码:

start() {
	// 截图图像是翻转的,所以y轴镜像
	this.node.scaleY = -1;

	// 创建渲染贴图对象
	this.texture = new cc.RenderTexture();
	this.texture.initWithSize(this.node.width, this.node.height, cc.game['_renderContext']['STENCIL_INDEX8']);

	// 在node上创建摄影机
	this.camera = this.node.addComponent(cc.Camera);
	// 不渲染0x10000000的cullingMask对象
	this.camera.cullingMask = 0xffffffff ^ this._cullingMask;
	this.camera.targetTexture = this.texture;
	// 关闭摄影机,否则每一帧它会自动进行渲染
	this.camera.enabled = false;

	// 将自身与忽略对象排除渲染
	this.cull(this.node);
	this.ignoredNodes.map(node => this.cull(node));

	// 创建一个sprite组件,由其进行渲染
	this.spriteFrame = new cc.SpriteFrame();
	this.sprite = this.node.addComponent(cc.Sprite);
	this.sprite.spriteFrame = this.spriteFrame;
	this.material["_props"]["bightness"] = this.bightness;
	this.material["_props"]["blurAmount"] = this.blurAmount;
	this.sprite["_materials"][0] = this.material;
}

// 截图并模糊
snapshot() {
	let size = this.node.getContentSize();
	if (size.width !== this._lastSize.width || size.height !== this._lastSize.height) {
		// 大小发生改变,重新设置texture大小
		this.texture.initWithSize(this.node.width, this.node.height, cc.game['_renderContext']['STENCIL_INDEX8']);
		this.camera.targetTexture = this.texture;
	}
	this._lastSize.width = size.width;
	this._lastSize.height = size.height;

	// 手动渲染摄影机,保存截图
	this.camera.render(cc.Canvas.instance.node);

	// 应用刚刚截图的贴图到sprite身上进行渲染
	this.spriteFrame.setTexture(this.texture);
}

只要不使用 sprite 里面spriteFrame.setTexture,只是截图,就不会报错

代码就是大佬的截图高斯模糊 例子
用到项目里后发现一直报这个,目前还不知道有什么影响

在2.1.2 正常没用报错

延迟一帧调用试试

延迟一帧调用在只有一个sprite 指向 对应的Texture不会报错,在多个sprite 指向同一个Texture,也会报上面的警告

应该还是没解决根本原因。

把这个绑定取消了

我在相机渲染的时候把精灵关了就不会报错,但是您说的this.camera.targetTexture 解绑好像还是一样有问题。
是不是相机在渲染写Texture的时候,精灵又同时在读取那个Texture导致的

是的,不能同时使用

好的,感谢!!

引擎是单线程的,会存在 “相机在渲染写Texture的时候,精灵又同时在读取那个Texture导致的” 的这个情况吗?

用2.2.2和2.3.4试了下上面的方法,都不行,而且小游戏上渲染异常。

image

试了把精灵节点的active 设置为false 再截图吗

我不是截图,很明显红框那里运行的时候就开始报错,已经延迟2秒了。。。

这个你可以Chrome断点进去,看下spriteFrame赋值的时候具体什么函数有问题,

应该是这个描述的问题:
https://stackoverflow.com/questions/62074822/webgl-feedback-loop-formed-between-framebuffer-and-active-texture

查到了一个报错原因:
图片节点group处于该相机cullingMask 范围内 , 导致相机渲染拍摄图片时,发生无限循环.
相机取消cullingMask下该节点类型的group,后可正常拍摄到节点

2赞

我遇到的就是这个问题,camera.render(rootNode)rootNode 中包含了 renderTexture 所在的节点,通过 camera.cullingMask 将这个节点剔除就可以正常渲染了

确实是这个原因导致的 :+1: :+1: :+1:

点赞点赞了