问题描述:
显示层级为
视频-蓝色背景-含有透明度的遮罩
期望视频不应该透出来才对
猜测是混合模式的问题
Cocos他们给出的解决方案:
同时:勾选预乘的时候不要忘了同时把Blend(src blend factor) 改为 ONE
我这边还涉及到远程下载的资源,所以我这边需要判断远程资源是否有透明度,写了一个方法
//检查texture2D是否有透明度 返回值: true 有
checkTextureTransparency(texture2D: cc.Texture2D): boolean {
if (!texture2D) {
console.error('Texture2D未设置!');
return;
}
const width = texture2D.width;
const height = texture2D.height;
const dataLength = width * height * 4; // 4个通道:RGBA
// 创建一个足够大的Uint8ClampedArray来存储像素数据
const pixels = new Uint8ClampedArray(dataLength);
for (let i = 3; i < dataLength; i += 4) {
// 跳过RGBA中的R,G,B,只检查A
if (pixels[i] < 255) {
// Alpha值小于255(即小于1.0,因为Alpha值范围是0-255)
return true; // 找到透明像素,结束函数
}
}
return false;
},
if (checkTextureTransparency(texture2D)) {//这里传你下载的远程资源
texture2D.setPremultiplyAlpha(true);
node.getComponent(cc.Sprite).srcBlendFactor = cc.macro.ONE;
}