3.8.8 BUG RenderTexture在安卓端报错 'blendState'

我在cocos3.8.8中,我想用RenderTexture让UI层显示3D人物,我的方法是用相机的targetTexture 指定这个RenderTexture,用Sprite的spriteFrame也指定这个RenderTexture,达到相机看到3D人物显示到UI层上。 但是在安卓平台,当游戏开始运行没问题,当我切换到战斗场景,在切换回UI场景就报错blendState,下面是具体报错。大佬看看,我工程原来是3.8.1版本,完全正常,现在升级到3.8.8,这里就报错了,就不显示了。大佬们看看,十分感谢!
E attributionTag not declared in manifest of com.nimigame.startgame
2025-12-19 08:43:49.386 707-1044 AppOps system_server
E attributionTag not declared in manifest of com.nimigame.startgame
2025-12-19 08:43:49.629 9744-9763 Cocos com.nimigame.startgame
E 00:43:49 [ERROR]: JS: TypeError: Cannot read properties of undefined (reading ‘blendState’)
TypeError: Cannot read properties of undefined (reading ‘blendState’)
at t._updateBlendFunc (src/cocos-js/cc.js:1:627723)
at t.updateMaterial (src/cocos-js/cc.js:1:627142)
at t.changeMaterialForDefine (src/cocos-js/cc.js:1:646051)
at t._applySpriteFrame (src/cocos-js/cc.js:1:647686)
at set spriteFrame [as spriteFrame] (src/cocos-js/cc.js:1:643879)
at I.DrawModel (assets/main/index.jsc:59:3198)
at assets/main/index.jsc:59:1922
at a.dispatchEvent (assets/main/index.jsc:93:734)
at ie.startMainUI (assets/main/index.jsc:139:5778)
at ie.start (assets/main/index.jsc:139:3384)
我尝试了重新加载Sprite,更换Sprite,更换相机,更换RenderTexture,当切换场景后,在切换回UI场景要显示的时候,还是报以上错误。无奈之下请大神帮助~~

有技术人员帮忙看下吗?这个是不是引擎bug.能修复吗?

没人遇到过这种情况吗?

就是UI开始渲染你的图片的时候 那边RT得东西还没准备好。让AI给你改能改好,是引擎bug

你好,方便提供可复现的demo ?

解决了吗,我也遇到了

解决了么 我也遇到了

1赞

我也遇到一样的问题,有人解决吗

我这边也遇到了,其实就是创建了一个spriteFrame,并把对应的RenderTexture赋值给摄像机的targetTexture,跟帖子一样,首次进入是没问题的,第二次再次创建调用的时候,渲染出现材质损坏的问题,只有在原生端出现,有什么解决方案吗??

并且在3.8.2是没问题的,升级3.8.7才有的问题

能否提供可复现的demo ?

我用极简代码也复现了

麻烦参考这个 PR 验证,谢谢。

这个PR会导致崩溃,以下是崩溃关键日志

05-29 15:46:05.629 4971 5007 E Cocos : 15:46:05 [ERROR]: [SE_ERROR] (C:/ProgramData/cocos/editors/Creator/3.8.8/resources/resources/3d/engine/native/cocos/bindings/jswrapper/v8/ScriptEngine.cpp, 1020): _onPassesUpdated is not a function: undefined

你好,可以提供下复现demo?

import { _decorator, Component, Node, Button, view, RenderTexture, Camera, director, Director, Sprite, SpriteFrame } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('test')
export class test extends Component {
    btnCaputre!: Button
    btnClose!: Button

    start() {
        this.btnCaputre = this.node.getChildByName("capture").getComponent(Button)
        this.btnClose = this.node.getChildByName("close").getComponent(Button)

        this.btnCaputre.node.on(Button.EventType.CLICK, () => {
            this.capture();
        })
        this.btnClose.node.on(Button.EventType.CLICK, () => {
            this.close();
        })
    }


    async capture() { 
        const node = new Node("_capture");
        const sprite = node.addComponent(Sprite);
        node.setParent(this.node);

        const renderTexture = new RenderTexture();
        renderTexture.initialize({
            width: Math.floor(view.getVisibleSize().width),
            height: Math.floor(view.getVisibleSize().height)
        });
        const spriteFrame = new SpriteFrame();
        spriteFrame.packable = false;
        spriteFrame.texture = renderTexture;

        const cameras = director.getScene().getComponentsInChildren(Camera).filter(camera => camera.node.activeInHierarchy);
        for (const cam of cameras) {
            cam.targetTexture = renderTexture;
        }
        await new Promise<void>((r, j) => director.once(Director.EVENT_AFTER_RENDER, r));
        for (const cam of cameras) {
            cam.targetTexture = null;
        }
        sprite.spriteFrame = spriteFrame;
    }

    close() {
        const _capture = this.node.getChildByName("_capture")
        if(!_capture || !_capture.isValid)
            return;
        const sprite = _capture.getComponent(Sprite)
        if(!sprite || !sprite.isValid)
            return;
        const spriteFrame = sprite.spriteFrame;
        sprite.spriteFrame = null;
        const renderTexture = spriteFrame.texture;
        spriteFrame.destroy();
        renderTexture.destroy();

        _capture.removeFromParent();
        _capture.destroy();
    }
}

弄两个按钮,然后来回点击,大概率复现。

这边实测,点击一次截图,再点击销毁,挂个1分钟,再点击截图就崩溃

你好,有下文吗?

是用388原始代码? android用什么机型?
我这边用388原始代码,在windows, android 都没复现。

是原始代码,打包到mumu模拟器12运行的,怀疑是v8那边的对象被GC了