C3D关于用RenderTexture截屏

在C3D中使用C2D的方式截图好像不太行。
摄像机没有render这个函数
RenderTexutre也没有readPixels

那我要怎么再给摄像机赋予一个RenderTexture后让摄像机渲染一帧并获取RenderTexture的像素数据呢?

3赞

看起来可以这么用,没测试没运行。。

追了一下代码,渲染代码感觉是下边这些。
root.ts:frameMove


camera.ts:initialize

1赞

自己搞了一下,没啥问题。

    public capture() {
        let camera = this.getComponent(CameraComponent);
        camera.targetTexture = this.renderTex;
        director.root.pipeline.render(camera.camera.view);
        this.copyRenderTex();
        camera.targetTexture = null;
    }

    public copyRenderTex() {
        let renderTex = this.renderTex;
        let arrayBuffer = new ArrayBuffer(renderTex.width * renderTex.height * 4);
        let region = new GFXBufferTextureCopy();
        region.texOffset.x = 0;
        region.texOffset.y = 0;
        region.texExtent.width = renderTex.width;
        region.texExtent.height = renderTex.height;
        director.root.device.copyFramebufferToBuffer(renderTex.getGFXWindow().framebuffer, arrayBuffer, [region]);

        return this.toB64(arrayBuffer);
    }

2赞

有截 单个节点的方法吗

看到你之前的帖子了,现在渲染逻辑也没想到啥太好的办法。我现在想的就只有把这个节点整体拿出来扔到一个单独的camera去渲染。比如放到一个单独的canvas。

放在canvas 3d里面默认是 屏幕大小的

没太明白,截图这个东西,你的renderTexture是多大不应该出多大的图么~

toB64是哪里的方法?director的?

感谢大佬解答,在转成base 64以后。我要怎么把base 64的图片转成SpriteFrame显示到界面里面呢?

自己写的。

啊,显示在sprite上?那不用转64,创建一个spriteframe。spriteframe.texture=rendertexture就行啦

我用


处理数据以后,再转成SpriteFrame

老是会报这个错,是哪里还没处理对吗

spriteframe.texture = rendertexture好像可以。:sweat_smile: 感谢感谢

renderTex是啥?

3Q,get

现在还有个问题

比如现在我只想要中间5:4的区域。

如果我把RenderTexture设置成500X400渲染出来的效果跟按实际尺寸750X1440渲染然后再只截取中间500X400的区域的效果有点不一致。

怎么样才能在用750 X 1440渲染后再截取中间5:4的区域数据出来呢?

hmmmmm,renderTexture可以理解成一块显示区,渲染的时候会保证高的可视范围是一定的(目前看到的是)

所以renderTexture不好改,但是spriteFrame是可以设置rect呀。

你的renderTexture设置750*1334,然后rect设置为125,520,500,400试试。

这个是我推理出来的,没做验证,你试试。

这个要设置相机的fov