关于shader去除bmp图片中黑色背景

vec4 frag () {
vec4 o = vec4(1, 1, 1, 1);
#if USE_TEXTURE
o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);
#endif
if (color.r < 0.05 && color.g < 0.05 && color.b < 0.05)
{
o = vec4(1,1,0,0);
}
else
{
o
=vec4(1,0,0,1);
}
return o;
}


看到图片不是黑色的都上红色了,在判断的时候不是应该黑色的也变透明了吗?怎么没有透明,求大神指教。

你 color ,是要改 o 吧,读取结果颜色

if (o.r < 0.05 && o.g < 0.05 && o.b < 0.05)

爬起来,试下,总感觉不是这个原因,还是起来试下

还真是这个的原因,可惜还不是我要的效果,还是有很多锯齿,感觉有没混合好,但是又不会,大神有指教吗?

void main () {
vec4 color = texture2D(texture, v_uv0);
float brightness = dot(color.rgb, vec3(0.299, 0.587, 0.114));
float alpha = smoothstep(0.0, 0.1, brightness);
gl_FragColor = vec4(color.rgb, alpha);
}

根据亮度来平滑确定透明度试试.
image

1赞

这样粗暴的判断黑色有问题

奇怪了,刚才看到你这个好像有用,然后去下了个传奇私服,然后导了点他的数据,图片很小,居然自动去掉了后面的黑色背景,但是图片不清晰。


导出后
image
然后放到cocos creator里面


可以看到,怎么自动去掉了黑色背景,但是图片不是很清晰。
和电脑上的区别太大了。
image
这个是什么原因?为什么会自动去掉黑色背景?

我的这个不够准备和精细。 你参考这个的shader。但是要确认下待处理的资源的数据格式。GitHub - bytedance/AlphaPlayer: AlphaPlayer is a video animation engine.

bmp 也可以有 透明通道的
https://bbs.huaweicloud.com/blogs/383366
很多是拿到透明图层去抠图的,所以单纯的这样做视觉效果怎么都不如直接通道的
你看到的黑色,其实在ps里面是透明的。。。。引擎拿到了图层信息后处理好就是和 Png一样的

opengl读取24位BMP文件为纹理并处理黑色背景为透明

想让黑色透明直接把grayscale作为alpha就行,而且不会硬边,更自然

else里面你 o = (1,0,0,1); 只剩下r通道了,“不是黑色”,肯定就变红色了。
else里啥都不用谢
if( 属于黑色条件 ){
discard; //或者 o.a = 0; 直接设置alpha通道是透明的
}
//不用else

这种不是直接改叠加模式嘛。

(帖子被作者删除,如无标记将在 24 小时后自动删除)

传奇的图我记得是有2张图的,一张黑底图一张遮罩图

传奇人物素材是一张图片的,主要是没有素材,都是自己去端游里面提取的。

能截图说说具体怎么操作吗?

怎么搞都达不到想要的效果啊。 :pensive: :pensive: :pensive:
image