透明度混合(Alpha blending)


前言

本文介绍unity渲染中的透明度混合,和透明度混合相关问题。


一、混合公式

1.说明

unity上,Blend Src Dst, 其中Src是指当前片元着色器输出的颜色,Dst是指缓存区中的颜色,src 可以简单理解为当前输出的颜色,dst表示上一次渲染的颜色(背景颜色)。

混合方程:

	C¯result=C¯source∗Fsource+C¯destination∗Fdestination

C¯source:源颜色向量。这是来自纹理的本来的颜色向量。
C¯destination:目标颜色向量。这是储存在颜色缓冲中当前位置的颜色向量。
Fsource:源因子。设置了对源颜色的alpha值影响。
Fdestination:目标因子。设置了对目标颜色的alpha影响。

公式解析:

假设混合方式为:Blend SrcAlpha OneMinusSrcAlpha
1)假设贴图有一个不透明红色点, Color(1,0,0,1),该点背景色为不透明蓝色 Color(0,0,1,1)。最终颜色 = (1,0,0)* 1 +(0,0,1)(1 - 1) = (1,0,0)
2)假设贴图有一个半透明红色点, Color(1,0,0,0.8),该点背景色为不透明蓝色 Color(0,0,1,1)
最终颜色 = (1,0,0)
0.8 +(0,0,1)(1 - 0.8) = (0.8,0,0.2)
而假如0.8变为0.2时,
最终颜色 = (1,0,0)
0.2+(0,0,1)*(1 - 0.2) = (0.2,0,0.8)

OpenGL混合参考链接

1.常用公式

类似PS上的效果:
Blend SrcAlpha OneMinusSrcAlpha 正常
Blend OneMinusDstAlpha One 柔和相加(Soft Addtive)
Blend DstColor Zero 正片叠底(Multiply),即相乘
Blend DstColor SrcColor 两倍相乘(2x Multiply)

BlendOp Min
Blend One One 变暗(Darken)

BlendOp Max
Blend One One 变亮(Lighten)

Blend OneMinusDstColor One 滤色(Screen)
Blend One One 线性减淡(Linear Dodge)

二、问题

解决Unity在线性空间下,UI对于带Alpha半透明的贴图,在混合颜色时就会出现错误。(备注:Unity线性空间下的sRGB选项不会对Alpha进行处理)。

混合公式:
Gamma空间下的Alpha混合公式:color = (A.rgb * A.a) + (B.rgb * (1 - A.a))
Linear空间下的Alpha混合公式:color = ((A.rgb ^ 2.2 * A.a) + (B.rgb ^ 2.2 * (1 - A.a))) ^(1 / 2.2)

解决步骤:
1)所有UI素材取消勾选sRGB选项,得到的混合公式为:color = ((A.rgb * A.a) + (B.rgb * (1 - A.a))) ^(1 / 2.2) ;
2)然后在输出的颜色上做一次pow(2.2),可以用后处理实现,Universal Render Pipeline管道中可以在BlitPass中做处理。

总结

透明度混合可以实现很多复杂的效果,选择不同的混合模式,可以解决很多渲染上显示问题,比如RT在UI上的显示问题,RT上的特效和UI结合显示的问题等。

参考

OpenGL混合模式
20余种颜色混合模式

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值