Photoshop图层混合模式公式(Unity,CG实现)

这篇具有很好参考价值的文章主要介绍了Photoshop图层混合模式公式(Unity,CG实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要目的来自于在unity符合美术在ps里面的演示效果。

两个图层叠加到一起的效果,废话不多说直接看效果:

图片资源在文章末尾

完整代码也在末尾

目录

目录

Multiply 正片叠底

 Screen 滤色

 Color Dodge 颜色减淡

 Color Burn 颜色加深

Linear Dodge 线形减淡

Linear Burn 线形加深

Overlay 叠加

 Hard Light 强光

Soft Light 柔光

亮光 vivid light

Linear Light 线形光

Pin Light 点光

Hard Mix 实色混合

Difference 差值

Excusion 排除

Hue 色相

HSV那几个模式异常说明:

完整代码:

测试效果图片资源:


Multiply 正片叠底

公式:

Ans = A * B;

half4 finalRGBA = half4(colorA.xyz * colorB.xyz,1);

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half4 finalRGBA =  half4(1 - (1 - colorA.xyz) * (1 -colorB.xyz),1);

 Screen 滤色

公式:

Ans = 1 - (1 - colorA ) * (1 - colorB);

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

 核心代码:

half4 finalRGBA =  half4(1 - (1 - colorA.xyz) * (1 -colorB.xyz),1);

 Color Dodge 颜色减淡  

公式:

ans=colorA / ( 1 - colorB);

效果对比:(unity存在些许过曝的情况)

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(colorA.xyz * (rcp(1 - colorB.xyz)),1);

 Color Burn 颜色加深

公式:

ans=1 -  (1 - colorA)/ colorB;

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(1- rcp(colorB.xyz) * (1 - colorA.xyz),1);

Linear Dodge 线形减淡

公式:

Ans  = colorA + colorB;

 效果对比:Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(colorB.xyz + colorA.xyz,1);

Linear Burn 线形加深

公式:

 Ans  = colorA + colorB  - 1 ;

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(colorB.xyz + colorA.xyz - 1,1);

Overlay 叠加


公式:


colorB<=0.5 :  Ans=2*colorA*colorB
colorB>0.5: Ans=1 - 2 * (1-colorA) * ( 1 - colorB)

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half3 c1 = colorA.xyz * colorB.xyz * 2 *OA ;
half3 c2 = (1 - 2 * (1 - colorA.xyz) *(1 - colorB.xyz)) * (1 - OA);
finalRGBA = half4(c1+ c2,1);

 Hard Light 强光

公式:

colorA <= 0.5:  Ans = 2 * colorA * colorB
colorA > 0.5   : Ans = 1 - 2 * (1 - colorA) * (1 - colorB)

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half3 OB = step(colorB.xyz,0.5);
half3 c1 = colorA.xyz * colorB.xyz * 2 *OB ;
half3 c2 = (1 - 2 * (1 - colorA.xyz) *(1 - colorB.xyz)) * (1 - OB);

Soft Light 柔光

公式:



colorA <= 0.5 : Ans = ( 2 * A - 1 ) * ( B - B * B ) + B;
colorA > 0.5 : Ans = ( 2 * A - 1 ) * ( sqrt ( B ) - B ) + B;

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half3 OB = step(colorB.xyz,0.5);
half3 c1 = ((2 * colorB - 1) * (colorA - colorA * colorA) + colorA) * OB ;
half3 c2 = ((2 * colorB - 1) * (sqrt(colorA)- colorA) + colorA) * (1 - OB);
                

亮光 vivid light

效果与ps中存在部分差异,但目前没找到原因,盲猜是因为自己没有模拟出图层上下级关系。

公式:

colorB <= 0.5 :  Ans = colorA - (1 - colorA) * ( 1 - 2 * colorB) / (2 * colorB);

colorB > 0.5  :  Ans = colorA + colorA * (2 * colorB - 1)/(2 * (1 - colorB));

效果对比:

上下层级不同的情况下(unity没有层级)

Photoshop图层混合模式公式(Unity,CG实现)

 Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

float3 c1 = colorB - (1 - colorB) * (1 - 2 * colorA) / (2 * colorA);
float3 c2 = colorB + colorB * (2 * colorA - 1) / (2 * (1 - colorA));
float3 OB = step(colorA.xyz,0.5);
c1 *= OB;
c2 *= (1 - OB);
finalRGBA = float4(c1+ c2,1);

Linear Light 线形光


公式:

Ans = colorB + 2 * colorA - 1;

效果对比:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = float4(colorA + 2 * colorB) - 1;

Pin Light 点光

公式:

colorB < 2 * colorA - 1 :  Ans = 2 * colorA - 1;

 2 * A - 1 < B < 2 * A    :  Ans = colorB;
colorB > 2 * colorA      :  Ans = 2 * colorA;

效果展示:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half3 OB = step(colorA,2 *colorB - 1);
half3 c1  = (2 * colorB - 1) * OB;
half3 OB1 = (1 - OB) * step(colorA , 2 * colorB);
half3 c2 = colorA * OB1;
half3 OB2 = 1 -  step(colorA ,2 * colorB);
half3 c3 = 2 * colorB * OB2;
finalRGBA = half4(c1 + c2 + c3,1);

Hard Mix 实色混合


公式:


colorA < 1 - colorB :  Ans = 0;
colorA > 1 - colorB :  Ans = 1;

效果展示:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

half3 OA = step(colorB, 1 - colorA);
half3 c1 = 0 * OA;
half3 OA1 = step(1 - colorA,colorB);
half3 c2 = 1 * OA1;
finalRGBA = half4(c1 + c2,1);

Difference 差值

公式:

Ans=|colorA-colorB|

效果展示:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(abs(colorB.xyz - colorA.xyz),1);

Excusion 排除

公式:

Ans=colorA+colorB-(colorA×colorB) * 2

效果展示:

Photoshop图层混合模式公式(Unity,CG实现)

核心代码:

finalRGBA = half4(colorB + colorA - 2 * colorB * colorA);

Hue 色相

公式:


Ans( HSV) =HB SA  VA

(HSV空间下) Ans = (colorB.x,colorA.y,colorB.z);

该效果再HSV空间下进行计算(后续需要转化为RGB)

效果展示:

Photoshop图层混合模式公式(Unity,CG实现)

 核心代码:

float3 c1 = float3(colorBHSV.x,colorAHSV.yz);
c1 = HSV2RGB(c1);
finalRGBA = half4(c1,1);

HSV那几个模式异常说明:

  • 这几个模式按照公式去计算并不能正常的得到目标结果所以,复刻不出来但是不是很懂怎么回事经测试转颜色空间并无差别且计算并无问题,具体的的混合算法来源也无差别出自官方文档维基百科等都是显示该结果,或为还有部分转化过程,待查证。
  • 饱和度混合模式保留底层的亮度和色调,同时采用顶层的色度。
  • 颜色混合模式保留底层的亮度,同时采用顶层的色调和色度。
  • 亮度混合模式保留底层的色调和色度,同时采用顶层的亮度。、

颜色混合未完待续。

完整代码:

Shader "Unlit/TestPs"
{
    Properties
    {
        _MainTexA ("TextureA", 2D) = "white" {}
        _MainTexB ("TextureB", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            float3 RGB2HSV(float3 c)
            {
                float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
                float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
                float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));

                float d = q.x - min(q.w, q.y);
                float e = 1.0e-10;
                return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
            }
            // Official HSV to RGB conversion 
            float3 HSV2RGB( float3 c ){
                float3 rgb = clamp( abs(fmod(c.x*6.0+float3(0.0,4.0,2.0),6)-3.0)-1.0, 0, 1);
                rgb = rgb*rgb*(3.0-2.0*rgb);
                return c.z * lerp( float3(1,1,1), rgb, c.y);
            }






            sampler2D _MainTexA;
            float4 _MainTexA_ST;
            sampler2D _MainTexB;
            float4 _MainTexB_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv.xy = TRANSFORM_TEX(v.uv.xy, _MainTexA);
                o.uv.zw = TRANSFORM_TEX(v.uv.xy, _MainTexB);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                float4 colorA = tex2D(_MainTexA, i.uv.xy);
                
                float colorALum =  Luminance(colorA.xyz);
                float4 colorB = tex2D(_MainTexB, i.uv.zw);
                float3 colorAHSV = RGB2HSV(colorA.xyz);
                float3 colorBHSV = RGB2HSV(colorB.xyz);
                float colorBLum =  Luminance(colorA.xyz);
                float4 finalRGBA = 0;
                // opacity 正片叠底
                finalRGBA = float4(colorA.xyz * colorB.xyz,1);
                // Screen 滤色
                // finalRGBA =  float4(1 - (1 - colorA.xyz) * (1 -colorB.xyz),1);
                // Color Dodge 颜色减淡
                // finalRGBA = float4(colorA.xyz * (rcp(1 - colorB.xyz)),1);
                // Color Burn 颜色加深
                // finalRGBA = float4(1- rcp(colorB.xyz) * (1 - colorA.xyz),1);
                // Linear Dodge 线形减淡
                // finalRGBA = float4(colorB.xyz + colorA.xyz,1);
                // Linear Burn 线形加深
                // finalRGBA = float4(colorB.xyz + colorA.xyz - 1,1);
                // overlay 叠加
                // float3 OA = step(colorA.xyz,0.5);
                // float3 c1 = colorA.xyz * colorB.xyz * 2 *OA ;
                // float3 c2 = (1 - 2 * (1 - colorA.xyz) *(1 - colorB.xyz)) * (1 - OA);
                // finalRGBA = float4(c1+ c2,1);
                
                // hard light 强光
                // float3 OB = step(colorB.xyz,0.5);
                // float3 c1 = colorA.xyz * colorB.xyz * 2 *OB ;
                // float3 c2 = (1 - 2 * (1 - colorA.xyz) *(1 - colorB.xyz)) * (1 - OB);
                // soft light 柔光
                // float3 OB = step(colorB.xyz,0.5);
                // float3 c1 = ((2 * colorB - 1) * (colorA - colorA * colorA) + colorA) * OB ;
                // float3 c2 = ((2 * colorB - 1) * (sqrt(colorA)- colorA) + colorA) * (1 - OB);
                // vivid light 亮光///
                // float3 c1 = colorB - (1 - colorB) * (1 - 2 * colorA) / (2 * colorA);
                // float3 c2 = colorB + colorB * (2 * colorA - 1) / (2 * (1 - colorA));
                // float3 OB = step(colorA.xyz,0.5);
                // c1 *= OB;
                // c2 *= (1 - OB);
                // finalRGBA = float4(c1+ c2,1);
                // linear Light 线性光
                // finalRGBA = float4(colorA + 2 * colorB) - 1;
                // 点光(存在等于符号问题)
                // B<2*A-1: C=2*A-1
                // 2*A-1<B<2*A: C=B
                // B>2*A: C=2*A
                // float3 OB = step(colorA,2 *colorB - 1);
                // float3 c1  = (2 * colorB - 1) * OB;
                // float3 OB1 = (1 - OB) * step(colorA , 2 * colorB);
                // float3 c2 = colorA * OB1;
                // float3 OB2 = 1 -  step(colorA ,2 * colorB);
                // float3 c3 = 2 * colorB * OB2;
                // finalRGBA = float4(c1 + c2 + c3,1);

                // 混合实色
                // float3 OA = step(colorB, 1 - colorA);
                // float3 c1 = 0 * OA;
                // float3 OA1 = step(1 - colorA,colorB);
                // float3 c2 = 1 * OA1;
                // finalRGBA = float4(c1 + c2,1);

                // 差值
                // finalRGBA = float4(abs(colorB.xyz - colorA.xyz),1);
                // Excusion 排除
                // finalRGBA = float4(colorB + colorA - 2 * colorB * colorA);
                // hue 色相
                // float3 c1 = float3(colorBHSV.x,colorAHSV.yz);
                // c1 = HSV2RGB(c1);
                // finalRGBA = half4(c1,1);

                return finalRGBA;


            }
            ENDCG
        }
    }
}

测试效果图片资源:

Photoshop图层混合模式公式(Unity,CG实现)

 Photoshop图层混合模式公式(Unity,CG实现)文章来源地址https://www.toymoban.com/news/detail-420920.html

到了这里,关于Photoshop图层混合模式公式(Unity,CG实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity实践记录】动画层的顺序和混合模式Override/Additive

    手册上关于 层顺序 的介绍基本没有,只是一个不明所以的QA一带而过: 层的排序是否重要? 是的。层的优先级是按顺序从上到下的。层设置为  override  将始终覆盖先前的层(如果层有遮罩,则基于其遮罩)。 基础层的权重值是否应始终设置为 1?或者在使用其他层时权重

    2024年02月04日
    浏览(27)
  • 空间解析几何 | 向量、数量积、向量积、混合积、距离公式

       注: 通过公式我们可以发现,两个向量的 数量积 就是一个 数量 。 数量积 又称为 点积 或者 内积 。 ex: 在直角坐标系 {O; i , j , k } 中,设 α = (a1, a2, a3), β = (b1, b2, b3),     α • β = (a1 i + a2 j + a3 k ) •  (b1 i + b2 j + b3 k ) = a1b1 + a2b2 + a3b3    即两向量的数量积之和等于它

    2023年04月09日
    浏览(25)
  • Unity里面CG和HLSL在写法上的一些区别

    回到目录 大家好,我是阿赵。这里继续讲URP相关的内容。 这次想讲的是CG和HLSL在写法上的一些区别。 首先,基本上大家都知道的事情再说一遍。 三种Shader编程语言: 1、基于OpenGL的 OpenGL Shading Language ,缩写 GLSL 2、基于DirectX的 High Level Shading Language ,缩写 HLSL 3、基于NVIDIA的

    2024年02月15日
    浏览(23)
  • 在Unity中编写Shader的编译器环境配置(支持CG和HLSL)

    Unity默认使用的编译器VisualStudio带有扩展插件ShaderLabVS,但功能很差,所以还是选用VisualStudioCode作为编写Shader的编译器,一方面其能自动识别Shaderlab语法,并且还有丰富的Shader扩展插件来辅助编写。 实际上编写时我们只希望.shader文件有VSCODE打开,其他脚本正常还是用VS,可以

    2024年02月15日
    浏览(29)
  • 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

     书接上回:【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 解放UI程序/美术? psd文件一键转ui prefab 支持所有ui类型 支持textmeshpro psd一键转ugui prefab工具 设计原理和详细使用方法 工具使用预览: 1. 实现将psd解析生成为UI预制体,并导出UI图

    2024年02月07日
    浏览(94)
  • 如何实现让最上面的图层不影响下面图层的点击事件(可穿透图层的鼠标事件)

    咱先来解决问题然后再了解是怎摸个原理在了解他的兼容性 pointer-events  直译为 指针事件 ,该属性指定在什么情况下某个DOM可以成为鼠标事件的 target。 简而言之,就是允许/禁止DOM的 鼠标事件 (click事件、hover事件、mouse事件等鼠标事件) 他当然不止一个属性值还有其他的某些

    2024年02月10日
    浏览(32)
  • 设计模式:模板模式和策略模式混合使用

    有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中模板模式和策略模式是比较常用的一个组合。模板模式可以定义这个逻辑的骨架,策略模式可以丰满具体细节的逻辑。 这个示例中,我们定义了一个策略接口和两个策略实

    2024年02月07日
    浏览(29)
  • 设计模式:策略模式和工厂模式混合使用

    有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中策略模式和工厂模式是比较常用的一个组合。工厂模式可以管理具体策略的生命周期,策略模式可以丰满具体细节的逻辑。 在这个示例中,我们定义了一个策略接口和两个

    2024年02月07日
    浏览(28)
  • Unity实现设计模式——状态模式

    状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现,GF框架中的FSM和流程控制就是基于这个原理实现的。 状态

    2024年02月08日
    浏览(27)
  • QGIS二次开发四:实现图层列表

    在实际开发中我们通常会遇到同时显示多个图层,并且还要实时显示和隐藏各图层的需求,如同 ArcGIS 的图层列表那样,界面左侧显示图层列表,列出当前已加载的所有图层,同时每个图层前面有复选框可以控制图层的显示/隐藏;界面右侧为画布,按图层列表的适当顺序显示

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包