[LayaAir3]laya3.2.4可以将相机renderTexture渲染到一张texture2d上么?

/**创建一个拍摄一帧 */
        CreateCaptureFrame(sp:Laya.Sprite,cameraSet:(camera:Laya.Camera)=>void,cb:(umd:UIModelData)=>void){
            const camera = GameMgr.uiModelMgr.CreateCamera()
            cameraSet && cameraSet(camera)
            GameMgr.timer.frameOnce(2,this,()=>{
                const arr = new Uint8Array(camera.renderTarget.width * camera.renderTarget.height * 4)
                camera.renderTarget.getDataAsync(0,0,camera.renderTarget.width,camera.renderTarget.height,arr).then((buffer)=>{
                    console.log(buffer)
                    const tex2d = new Laya.Texture2D(512,512,Laya.TextureFormat.R8G8B8A8,true,false)
                    tex2d.setPixelsData(buffer,false,false)
                    const data:UIModelData = {
                        camera,
                        sp,
                        tex2d:tex2d,
                    }
                    camera.active = false
                    sp.texture = new Laya.Texture(tex2d)
                    this.createDatas.push(data)
                    cb && cb(data)
                })
            })
        }我之前让相机拍摄一帧,并不想持续拍摄,这是我尝试实现的代码,但是没有显示
已邀请:

LayaAir大为

赞同来自:

我提供的代码就是捕获了3D场景中相机拍摄的画面,我没太懂你的意思,我把整个项目都发出来,版本是3.2.4,运行时多点击几次按钮就能看到效果了。

LayaAir大为

赞同来自:

您好,您可以尝试一下这段代码,应该可以达到您要的效果const { regClass, property } = Laya;

@regClass()
export class Script extends Laya.Script {
    //declare owner : Laya.Sprite3D;
    declare owner : Laya.Sprite;

    public texture: Laya.Texture;

    //场景中要添加一个按钮
    @property(Laya.Button)
    public button: Laya.Button;

    public texture2D: Laya.Texture2D;

    private uint8Array: Uint8Array;

    // 组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次
    onAwake(): void {
        this.texture2D = new Laya.Texture2D(256, 256, Laya.TextureFormat.R8G8B8A8, false, true);
        this.button.on(Laya.Event.CLICK, this, this.onButtonClick);

        //加载渲染纹理,加载成功后得到的是一个Laya.Texture对象
        Laya.loader.load("resources/RenderTexture.rendertexture").then((res) => {
            this.texture = res;
        })
    }

    onButtonClick() {

        this.uint8Array = this.texture.getTexturePixels(0, 0, 256, 256);
        this.texture2D.setPixelsData(this.uint8Array, false, false);
        this.owner.texture = new Laya.Texture(this.texture2D);

    }

}
 

年年有肝

赞同来自:

感谢你的回复,我现在的需求是捕获相机拍摄的图片,但是你给的例子是获取静态texture的像素。经过我的摸索,我用下面代码实现了功能
        /**创建一个拍摄 */
        CreateCapture(sp:Laya.Sprite){
            const camera = GameMgr.uiModelMgr.CreateCamera()
            sp.texture = new Laya.Texture(camera.renderTarget)
            const data:UIModelData = {
                camera,
                sp,
            }
            this.createDatas.push(data)
            return data
        }
        /**创建一个拍摄一帧 */
        CreateCaptureFrame(sp:Laya.Sprite,cameraSet:(camera:Laya.Camera)=>void,cb?:()=>void){
            if(sp.texture && !sp.texture.destroyed){
                sp.texture.destroy()
            }
            const umd = this.CreateCapture(sp)
            cameraSet && cameraSet(umd.camera)
            GameMgr.timer.frameOnce(1,this,()=>{
                const htmlCanvas = sp.drawToCanvas(sp.width,sp.height,0,0)
                this.Recycle(umd)
                sp.texture = htmlCanvas.getTexture() as Laya.Texture
                cb && cb()
            })
        }但是捕获到的图片发白,不知道怎么回事

该问题目前已经被锁定, 无法添加新回复

商务合作
商务合作