当前位置: 代码迷 >> 综合 >> 透明度混合(Alpha blending)
  详细解决方案

透明度混合(Alpha blending)

热度:40   发布时间:2024-02-27 17:52:20.0

文章目录

  • 前言
  • 一、混合公式
    • 1.说明
    • 1.常用公式
  • 二、问题
  • 总结
  • 参考


前言

本文介绍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余种颜色混合模式

  相关解决方案