我在使用3.8.1对小部分区域进行截图,所得的texture在一个 ‘mySprite’上显示是上下颠倒的。我在texture和mySprite上没有发现什么设置可以解决这个问题,如果只是这样就好了。于是我就把mySprite的 yScale设置为-1。很好,这样能正确显示了。但是假如你把mySprite或者它的某个祖节点active设置为false再设置为true时,发现图像又颠倒了,那么mySprite的 yScale又得设置回1.请问这个颠倒是为什么呢。
颠倒问题和引擎关系不大。跟不同平台的渲染系统的坐标系设置有关,大致就是一种是左上角为00点,一种是左下角00点导致的。unity也会遇到这种问题。
看了下引擎代码, 你给 mySprite 设置完 spriteFrame 后,调用下 mySprite.updateMaterial(), 就不用设置 yScale -1 了
我在使用截图示例的时候 调整的是camera scale,ios和web无需翻转。在android上是翻转的,把camera设置yScale = -1结果是180度旋转而不是翻转,该如何设置?
在截屏保存时将数据重新排序下,存下来的图片就不会颠倒了。
rtBuffer = new Uint8Array(width * height * 4);
for (var i = height - 1; i >= 0; i–) {
for (var j = 0; j < width; j++) {
rtBuffer[((height - 1 - i) * (width) + j) * 4 + 0] = buffer[(i * width + j) * 4 + 0];
rtBuffer[((height - 1 - i) * (width) + j) * 4 + 1] = buffer[(i * width + j) * 4 + 1];
rtBuffer[((height - 1 - i) * (width) + j) * 4 + 2] = buffer[(i * width + j) * 4 + 2];
rtBuffer[((height - 1 - i) * (width) + j) * 4 + 3] = buffer[(i * width + j) * 4 + 3];
}
}
我也是重新排的,只是想问一下有没有更高效的方式
要高效那就得用shader了
js 循环太多要挂了,有个按行切片的api,效率更高
updateMaterial() 一下就好
宝贝 demo发出来
我提交了一个 PR,楼主可以定制引擎试一下
fix sprite rt adaptation by yanjifa · Pull Request #16689 · cocos/cocos-engine (github.com)
球大佬指点 mySprite 没有updateMaterial这个方法啊
估计 没有导出给cc.d.ts 文件 ,不过问题不大
onRestore 方法也是一样的