谁来抬我一手。。。。不行了啊

shader不会很卡吗,我一开始想用shader,发现加上材质之后让预制体变得非常卡

可能是我没有表达清楚老哥,我的意思是想根据读出的像素分布(各种颜色),对其他图片进行一些处理,我这里因为后面的内容不能用mask处理,如果缩放的话,图片显示出来的大小确实是对的,但是读取出来的像素矩阵还是和原来一样大,没有办法判定这个图片在300×300区域里的像素分布,还有没有别的办法。。。额。。。。。额。。。。

opencv可以做到,有 wasm 版本
KOUFQ6{U@BPUTZ8_9

如果不用到库, 也可以自己简单写一个线性插值到函数,例如shader的mix函数那样去计算

这个需求要获取指定区域的像素值吗?

getTextureData() {

    let node = this.tank.node;

    let sprite = node.getComponent(Sprite);

    let ui = node.getComponent(UITransform);

    let worldPos = node.getWorldPosition();

    let texBuffers: ArrayBufferView[] = [];

    texBuffers[0] = new Uint8Array(width * height * 4);

    let region = new gfx.BufferTextureCopy();

    region.texOffset.x = Math.round(worldPos.x);

    region.texOffset.y = Math.round(worldPos.y);

    region.texExtent.width = width;

    region.texExtent.height = height;

    director.root.device.copyTextureToBuffers(sprite.spriteFrame.getGFXTexture(), texBuffers, [region]);

    let dataArr = texBuffers[0] as Uint8Array;

    return dataArr;

}
3赞

什么意思?
我理解的是这样的:节点的某一个位置p,对应到图片的p1, 然后取p1位置的像素值, p1有时候不一定是整数,就需要用插值来操作了

是这样的,节点的某一个位置p,需要对应到某一图片的位置p1;
图片和节点显示出来一样大,不过图片实际的大小和节点不一样;
因此图片返回的像素数组没法靠某个点在节点里的位置寻找其在数组中的位置;
没法得到节点中某个点的像素值;
请问插值可以解决吗?

p和p1的关系就是scaleX和scaleY的关系,算出来不一定是整数, 直接用插值就行,就是shader的mix函数,计算两个像素之间的某一个线性插值,没那么复杂

也有非线性插值, 看你需要的效果和复杂程度

插值是我直接除一个ScaleX或者ScaleY的意思吗,呃呃,我今天算了半天,虽然我算的不对但是效果超级卡,是这样的,我再做一个拼图游戏,预制体生成了很多方块,总的形状可能是一个鸭子或者苹果这样(底色是黑色的,外部是透明的),我需要用鸭子和苹果的图片对这些方块进行切割,切割后的方块直接编辑像素后面用来生成拼图的选项,但是我觉得超级超级卡,而且现在似乎也搞不定,大佬有好办法吗。。。。。。mask的话选项就没法生成了

https://baike.baidu.com/item/线性插值/19113392

你要的是方块里面的像素吗?

是的,主要是在边界上的方块,它们往往被边界线裁掉了一部分,拼图的选项其实是这些方块组合起来的,每一个都是几个小方块拼在一起这样

方块是纯矩形吗?
如果是就用spriteframe的mesh方法渲染,有点像这个 2D实现背景图3D滚动效果(透视) !
这种方法渲染,不会产生很多unitarray存储像素,就是算一下各个矩形的顶点就可以了

如果不是,也可以用上述方法, 不过麻烦一点,需要保存一下方块的形状三角形数据,然后利用规律应该可以算出全部的三角形数据

但是我觉得这个方法做出来的效果可能锯齿会挺严重的

好的多谢,我试试!

你的帖子已经被社区标记并被临时隐藏。

shader操作 像素应该最快 比在程序处理像素

好的谢谢,我试试shader