我想把一个Texture2D 对象 一份为二变成两个Texture2D对象

var renderTexture = new cc.RenderTexture();
renderTexture.initWithSize(556, 582);
renderTexture.drawTextureAt(this.textureList[1], 0, 0);
const a = renderTexture.readPixels();
const b = renderTexture.readPixels(a, 0, 0, 278, 582);
cc.log(a, b);
var renderTexture1 = new cc.RenderTexture();
renderTexture1.initWithData(b, cc.Texture2D.PixelFormat.RGB888, 278, 582);
cc.log(renderTexture1);
this.node.getComponent(cc.Sprite).spriteFrame.setTexture(renderTexture1);

这么写不行,请教改怎么写

2赞

刚才不是才合起来了吗, 怎么又想分开

业务的需求你永远想不到

这次是想实现什么功能需要分开的,如果想要还原到以前的2张图,怕是办不到的

不是 就是平分 ,一份为二

如果只是渲染需要可以直接 new SpriteFrame, 并且设置区域,就可以使用了

const a = renderTexture.readPixels(); // 获得的是Uint8Array
var renderTexture1 = new cc.Texture2D();
renderTexture1.initWithData(a, cc.Texture2D.PixelFormat.RGB888, 556, 582); //需要ArrayBufferView

关键还是没有SpriteFrame

分成的2个 Texture2D对象是拿来干嘛的
直接 let spriteFrame= new cc.SpriteFrame(纹理对象);
spriteFrame.setRect(裁剪区域)。这样这个spriteFrame就是那个区域,可以拿去渲染
具体 SpriteFrame API 看官方文档

Uint8Array可以变成ArrayBufferView 吗

var renderTexture1 = new cc.RenderTexture();
renderTexture1.initWithSize(278, 582);
var renderTexture2 = new cc.RenderTexture();
renderTexture2.initWithSize(278, 582);
renderTexture1.drawTextureAt(this.textureList[1], 0, 0);
renderTexture2.drawTextureAt(this.textureList[1], -278, 0);

这样?

    let renderTexture = new cc.RenderTexture();
    renderTexture.initWithSize(224, 85);
    cc.renderer.device.setFrameBuffer(renderTexture._framebuffer);
    
    renderTexture.drawTextureAt(this.textureList[0], 0, 0);
    renderTexture.drawTextureAt(this.textureList[1], 80, 0);
    let data = renderTexture.readPixels(null, 112, 0, 112, 85);
    let texture = new cc.Texture2D();
    texture.initWithData(data, cc.Texture2D.PixelFormat.RGBA8888, 112, 85);
    let spriteFrame = new cc.SpriteFrame();
    spriteFrame.setTexture(texture);
    let sprite = this.node.getComponent(cc.Sprite);
    sprite.spriteFrame = spriteFrame;

4赞

可以了 ,非常感谢
请问一下
cc.renderer.device.setFrameBuffer(renderTexture._framebuffer);这段的意义是什么,把数据绑定留住吗
可以理解为帧缓冲吗

1赞

cc.renderer.device.setFrameBuffer(renderTexture._framebuffer) 改成这样也行

let gl = cc.game._renderContext;
let oldFBO = gl.getParameter(gl.FRAMEBUFFER_BINDING);
gl.bindFramebuffer(gl.FRAMEBUFFER, renderTexture._framebuffer._glID);
gl.framebufferTexture2D(
gl.FRAMEBUFFER,
gl.COLOR_ATTACHMENT0,
gl.TEXTURE_2D,
renderTexture._framebuffer._colors[0]._glID,
0
);
gl.bindFramebuffer(gl.FRAMEBUFFER, oldFBO);

直接使用readPixels是有一个webgl报错的,类似这个问题
应该是Framebuffer Completeness相关的问题吧,绑定上颜色附件就能正确读取了

mark!!

这个要mark

mark $$$

请问下,3.x 没有drawTextureAt 怎么破啊