RenderTexture获取纹理像素颜色信息,在PC原生环境下巨卡的问题

最开是是初始化一个 RenderTexture 对象然后调用 drawTextureAt 画上纹理数据再 readPixels,但是得到的数据都是 0,然后发现要用相机照一下才有数据,于是直接改成下面这种将 node 渲染到 RenderTexture 再读取,在 web 端没问题,但是在 PC 原生端下面会巨卡。。。

引擎版本:2.4.7

有没有哪位大佬指点一下?或者给个别的方案也行。

自己能想到的方案:
jsb绑定到 c++,用c++直接读取纹理数据。。 这个方案我不会c++更不会jsb绑定
发布web版用electron包装成桌面程序。。 这个方案还得自己再写一套热更新方案

还有就是 shader 中 CCTexture(texture, v_uv0, o) 方法可以得到像素信息,
不知道能不能在片元着色器中将得到的像素值传回 UI 层?

这个是我现在用到的代码。。PC原生端调用该方法巨卡。。。而且得到的数据也有问题

function getRenderTexture(node){

if (cc.isValid(node)) {

    const width = Math.floor(node.width),

        height = Math.floor(node.height),

        out = new cc.RenderTexture(),

        cameraNode = new cc.Node(),

        camera = cameraNode.addComponent(cc.Camera);

       

    out.initWithSize(width, height);

    cameraNode.parent = node;

    camera.clearFlags |= cc.Camera.ClearFlags.COLOR;

    camera.backgroundColor = cc.color(0, 0, 0, 0);

    camera.zoomRatio = cc.winSize.height / height;

   

    camera.targetTexture = out;

    camera.render(node);

    cameraNode.destroy();

    return out;

}

return null;

}

感觉你代码没写对,getRenderTexture是个事件回调?
在一个回调中没办法渲染到数据啊,渲染一般需要一帧以上才能有结果。

建议参考下官方文档,我对creator不熟

https://docs.cocos.com/creator/3.8/manual/zh/asset/render-texture.html
https://github.com/cocos/cocos-test-projects/tree/v3.8/assets/cases/rendertexture

在 web 端是可以取到数据的,在 PC 端会非常卡,而且取到的数据有问题。

不知道你的pc端的texture中能否获取到gl;web端实测是可以通过这个api gl.readPixels(x, y, width, height, format, type, data);来获取像素信息的。

是的,web端没问题,PC端一调用这个函数就卡住起码一秒,然后取到的数据也有问题