第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Blend 混合模式

Blend 混合模式

时间:2023-11-30 01:21:37

相关推荐

Blend 混合模式

参考

韩世麟 把 PS 图层混合模式理解到这个程度,就算是入门了

Wiki Blend_modes

冯乐乐 《Unity Shader入门精要》

Ps混合模式的计算原理,宇宙最穷的进阶笔记

混合

图层混合模式规则

0 - 255要换算到0 - 1区间逐像素,分通道

常见的混合类型

为叙述方便,定义原图或下层的颜色为底色A,画笔或上层颜色为绘图色B,混合之后的颜色为最终色C

各种模式

正常透明度混合(Normal)

默认状态,最终色与绘图色相同。当上层有透明度时混合方式如下:

C=A∗(1−B.alpha)+B∗B.alphaC = A *(1 - B.alpha) + B * B.alphaC=A∗(1−B.alpha)+B∗B.alpha

溶解(Dissolve)

从两个图层中随机取得像素,上层图像的不透明度越高所占权重越高

变暗系

变暗(Darken)

选取两个颜色中较暗的颜色作为最终色

C=min(A,B)C = min(A, B)C=min(A,B)

正片叠底(Multiply)

将两种颜色相乘

C=ABC = A BC=AB

去白留黑满足交换律,上下不影响结果可使用黑白线稿与原图相乘来获得描边模拟暗房中两张正片(所见即所得的底片)重叠的效果

颜色加深(Color Burn)

将底层反相后除以顶层,再反相

C=A−(1−A)(1−B)/B=1−(1−A)/BC = A - (1 - A) (1 - B) / B=1-(1-A)/BC=A−(1−A)(1−B)/B=1−(1−A)/B

将纯黑图层至于上方时,图像不会变成全黑,会出现失真现象(分母不能出现0,ps中的输入值最大为251,因此底图的过曝部分不会受到影响)

线性加深

将两个图层相加后减去1,等价于两个图层取反相加再取反(线性减淡各项取反)

C=A+B−1=1−((1−A)+(1−B))C = A + B - 1=1-((1-A)+(1-B))C=A+B−1=1−((1−A)+(1−B))

变亮系

变亮(Lighten)

选取两个颜色中较亮的作为最终色

C=max(A,B)C = max(A, B)C=max(A,B)

滤色(Screen)

将两种颜色取反之后相乘,再取反

C=1−(1−A)(1−B)C = 1 - (1 - A) (1 - B)C=1−(1−A)(1−B)

去黑留白

滤色之后的图像会提亮且绝对不会过曝(结果必小于1),能够保留更多细节

A的反相与B的反相相乘等于C的反相,可看作是正片叠底的逆运算(各项均取反)(1−C)=(1−A)(1−B)(1-C)=(1-A)(1-B)(1−C)=(1−A)(1−B)

两张相同的图片进行滤色约等于将中间亮度提高到75%的曲线

模拟在暗房中将两张负片重叠后进行曝光的效果

颜色减淡(Color Dodge)

底层除以反相后的顶层

C=A+(A∗B)/(1−B)=A/(1−B)C = A + (A * B) / (1 - B)=A/(1-B)C=A+(A∗B)/(1−B)=A/(1−B)

将纯白图层至于顶层后不会变成全白,会出现失真

线性减淡(Linear Dodge / Additive)

两图层相加

C=A+BC = A + BC=A+B

饱和度系

叠加(overlay)

根据底色是否大于50%中灰来决定使用正片叠底滤色,使暗的变暗、亮的变亮,提高对比度

{C=2AB,ifA<0.5C=1−2(1−A)(1−B),otherwise\begin{cases} C=2AB, & ifA<0.5\\ C=1-2(1-A)(1-B),&otherwise\\ \end{cases}{C=2AB,C=1−2(1−A)(1−B),​ifA<0.5otherwise​

抠中灰,留黑白对应函数曲线如下图,可以看出当图片叠加它自己时等效于如下图的曲线,亮部变亮、暗部变暗以提高对比度

强光(Hard Light)

公式与叠加模式相同,但是叠加是根据底色来判断,强光则是根据绘图色与50%中灰的关系来判断使用正片叠底还是滤色

{C=2AB,ifB<0.5C=1−2(1−A)(1−B),otherwise\begin{cases} C=2AB, & ifB<0.5\\ C=1-2(1-A)(1-B),&otherwise\\ \end{cases}{C=2AB,C=1−2(1−A)(1−B),​ifB<0.5otherwise​

柔光(Soft Light)

根据绘图色的明暗来决定提亮还是变暗,原理与强光相同,曲线相比于强光更加柔和

{C=2AB+A2(1−2B),ifB<0.5C=2A(1−B)+A(2B−1),otherwise\begin{cases} C=2AB+A^2(1-2B), & ifB<0.5\\ C=2A(1-B)+\sqrt{A}(2B-1),&otherwise\\ \end{cases}{C=2AB+A2(1−2B),C=2A(1−B)+A​(2B−1),​ifB<0.5otherwise​

柔光与叠加的曲线对比

叠加的上下图层*

ps中对混合模式常用的操作是在原图上方增加一个图层作为控制图层,从直觉上来判断是对上方图层的操作影响了下方图层。

在这种方式下,使用黑色笔刷在控制图层上进行涂抹时,混合之后的图像并不会变成纯黑色,与公式中两倍的正片叠底/两倍的滤色不匹配。

分析公式可以得知,叠加的控制层应该在下方,即下方颜色与中灰的关系决定最终图像是变亮还是变暗。

将控制图层至于下方时,可以看到最终效果符合公式定义。

因此许多人对图层混合的理解其实是错误的。使用传统的操作方法可能会出现灰度突变的问题。

下图中使用上方图层作为控制层,用黑色笔刷进行加深之后,能看到中间有一道明显的分界线。因为实际上的控制层在下方,因此下图中接近中灰的位置会进行判断,左侧使用的正片叠底而右侧使用了滤色。

而上方的图层是被改变的图层,左侧的纯黑经过正片叠底运算之后依旧是纯黑,并不会受影响。但是右边的纯黑会受到滤色的影响而迅速变亮。这就形成了中灰位置的分界线。

但是反过来,这种特性也能够起到保留边界的作用。

下图中左侧的墙壁亮度小于50%,右侧亮度大于50%,因此中间的分界线得到了非常清晰的保留。

将调整图层至于上方的传统做法虽然与实际原理不符,但是不代表一定是错误的用法。毕竟根据只要它看起来是对的那么它就是对的的原则,能够得到想要的效果的方法就是最好的方法。实际应用中应当根据实际的需求来决定,切忌教条化。

Unity中的颜色混合

混合操作发生于光栅化阶段最后的逐片元操作中,透明度测试之后

渲染顺序

在开启深度写入的情况下,物体背后的其他物体会在深度测试中被剔除,导致无法通过半透明表面看到后边的物体,因此半透明物体的渲染需要关闭深度写入。

因为半透明物体的渲染需要关闭深度写入,所以半透明物体的渲染顺序非常重要。

渲染引擎一般都会先对物体进行排序,再渲染。常用的方法为:

先渲染所有不透明物体,并开启它们的深度测试与深度写入。把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,关闭深度写入。

但是以上面的方法进行渲染还是会出现一些问题。由于深度缓冲区中的值是像素级别的,排序时却是对物体进行排序,这就会导致有些物体之间出现穿插产生了循环重叠的现象时无法得到正确的渲染结果。

上图中三个循环重叠的物体无法得到正确的渲染结果。这种情况需要通过分割网格的方法来解决。

Unity中解决渲染顺序问题提供的方案是渲染队列(render queue)。使用SubShader的Queue标签来决定模型归属于哪个队列。Unity内部使用一系列整数索引来表示每个渲染队列,且索引号越小表示越早被渲染。

ShaderLab的混合命令

当片元着色器产生一个颜色时,可以选择与颜色缓冲中的颜色进行混合。混合与两个参数有关:源颜色(source color)目标颜色(destination color)。源颜色用S表示,指的是片元着色器生成的颜色值;目标颜色用D表示,指的是颜色缓冲中读取到的颜色值。将它们混合之后得到的输出颜色O会重新写入颜色缓冲区。

混合是一个逐片元的操作,不可编程但是高度可配置。将源颜色S和目标颜色D通过混合等式(blend equation)进行混合后得到输出颜色O。进行混合时需要使用两个混合等式:一个用于混合RGB通道,一个用于混合A通道。

设置混合状态状态实际上设置的是混合等式中的操作因子。默认状态下的操作为加操作,因此通常需要设置的是混合因子。设置2个因子,RGB和A将以相同的方式进行混合;设置4种因子,RGB和A将以各自的方式进行混合。

混合公式:

Orgb=SrcFactor×Srgb+DstFactor×DrgbOa=SrcFactorA×Sa+DstFactorA×DaO_{rgb}=SrcFactor\times S_{rgb}+DstFactor\times D_{rgb} \\ O_{a}=SrcFactorA\times S_{a}+DstFactorA\times D_{a} Orgb​=SrcFactor×Srgb​+DstFactor×Drgb​Oa​=SrcFactorA×Sa​+DstFactorA×Da​

ShaderLab 中的混合因子

使用上边的指令进行设置时,RGB通道的混合因子和A通道的混合因子都是一样的。有时我们希望可以使用不同的参数混合A通道,这时就可以利用Blend SrcFactor DstFactor,SrcFactorA DstFactorA 指令。例如,如果我们想要在混合后输出颜色的透明度就是源颜色的透明度,可以使用下面的命令:

Blend SrcAlpha OneMinusSrcAlpha, One Zero

混合操作

上面涉及的混合等式都是将源颜色和目标颜色与对应的混合因子相乘后的结果相加作为输出颜色。使用ShaderLab的BlendOp BlendOperation命令可以设置其他的混合操作。

常见的混合类型

通过混合操作和混合类型的组合,可以得到一些类似Photoshop混合模式中的混合效果

//正常(Normal),即透明度混合Blend SrcAlpha OneMinusSrcAlpha//柔和相加(Soft Additive)Blend OneMinusDstColor One//正片叠底(Multiply)Blend DstColor Zero//变暗(Darken)BlendOp MinBlend One One//变亮(Lighten)BlendOp MaxBlend One One//滤色(Screen)C = 1-(1-A)(1-B) = A+B-AB = A+B(1-A) = A(1-B)+BBlend OneMinusDstColor One//等同于Blend One OneMinusSrcColor //线性减淡Blend One One

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。