Photoshop正片叠底的计算分析

本文详细解释了Photoshop中“正片叠底”混合模式的工作原理及计算公式,通过实例展示了不同颜色叠加产生的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在对Photoshop中有关图层混合模式中的“正片叠底”作出如下计算分析:

 

  一、查看每个通道中的颜色信息,并将基色与混合色复合。结果色总是较暗的颜色。
  二、任何颜色与黑色复合产生黑色。
  三、任何颜色与白色复合保持不变。
  四、当用黑色或白色以外的颜色绘画时,绘画工具绘制的连续描边产生逐渐变暗的颜色。这与使用多个魔术标记在图像上绘图的效果相似。

 

很多朋友并不明白这到底是怎么回事,其实“正片叠底”的计算公式是:A*B/255。(A、B是指的图层A和图层B)

下面是两个图层中的图片,用“正片叠底”后,你能够判断出用“计算公式”“混合”后的结果吗?!可能会很困难吧?

Photoshop正片叠底的计算分析

 

那么,计算公式:A*B/255。是什么意思呢?

  一开始,我也闹不明白是什么意思。慢慢琢磨吧!

  其实就是指:

  A图层中的红色通道和B图层中的红色通道所对应的每一个像素的灰阶值相乘,再被255除。得到一个新的红色通道。
  A图层中的绿色通道和B图层中的绿色通道所对应的每一个像素的灰阶值相乘,再被255除。得到一个新的绿色通道。
  A图层中的蓝色通道和B图层中的蓝色通道所对应的每一个像素的灰阶值相乘,再被255除。得到一个新的蓝色通道。

  三个“新”的红、绿、蓝通道就得到一个“新”的“正片叠底”的结果图。

  够复杂的吧!好在是Photoshop控制计算机帮我们在算,(ps真厉害、计算机真伟大!!)我们只是理解理解而已。

  下图就是上面A、B图层“正片叠底”的结果:
 

Photoshop正片叠底的计算分析
 


这个“正片叠底”是怎么实现的呢?过程又是怎样的呢?用文字简直是难以表述,还是请看下图,动动脑筋,想一想,理解理解。

Photoshop正片叠底的计算分析

 


那么既不是白,又不是黑的“正片叠底”又会是怎样的关系呢?

  我曾经做过一些验证性的实验,请用Photoshop打开下面的图片,用吸管工具查查灰阶值,算一算,验证一下,你就会相信“计算公式”是正确的了。

Photoshop正片叠底的计算分析 Photoshop正片叠底的计算分析 Photoshop正片叠底的计算分析 Photoshop正片叠底的计算分析 Photoshop正片叠底的计算分析

<think>我们参考引用[1]中提供的正片叠底、叠加等混合模式代码示例,特别是用户现在需要实现的是正片叠底(Multiply)混合效果。注意:引用中展示的是叠加(Overlay)混合模式的代码,而用户需要的是正片叠底正片叠底(Multiply)的数学公式是:结果颜色=基础颜色*混合颜色。这里的颜色分量通常在[0,1]范围内。因此,对于每个颜色通道(R、G、B),我们分别将基础纹理(_MainTex)和混合纹理(_BlendTex)的对应分量相乘。在UnityShader中,我们可以使用一个简单的片段着色器来实现。下面是一个基本的Shader代码示例,用于实现正片叠底混合,并带有一个控制混合程度的透明度参数(_Opacity),用于插值混合结果和原始基础纹理。注意:我们假设有两个纹理:_MainTex(基础纹理)和_BlendTex(混合纹理),以及一个范围在0到1的浮点数属性_Opacity来控制混合的强度。步骤:1.定义属性:包括两个纹理和混合参数_Opacity。2.在片段着色器中,采样两个纹理。3.对每个颜色通道执行正片叠底操作:blendedColor=baseColor*blendColor。4.使用_Opacity在原始基础纹理和混合后的颜色之间进行线性插值(lerp)。5.输出最终颜色。以下是完整的Shader代码:```Shader"Custom/MultiplyBlendMode"{Properties{_MainTex("Base(RGB)",2D)="white"{}_BlendTex("BlendTexture",2D)="white"{}_Opacity("BlendOpacity",Range(0,1))=1.0}SubShader{Tags{"RenderType"="Opaque"}LOD200Pass{CGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG.cginc"structappdata{float4vertex:POSITION;float2uv:TEXCOORD0;};structv2f{float2uv:TEXCOORD0;float4vertex:SV_POSITION;};sampler2D_MainTex;sampler2D_BlendTex;float_Opacity;v2fvert(appdatav){v2fo;o.vertex=UnityObjectToClipPos(v.vertex);o.uv=v.uv;returno;}fixed4frag(v2fi):SV_Target{//采样基础纹理和混合纹理fixed4baseColor=tex2D(_MainTex,i.uv);fixed4blendColor=tex2D(_BlendTex,i.uv);//正片叠底混合:每个通道相乘fixed4blendedColor=baseColor*blendColor;//使用_Opacity在原始基础颜色和混合后的颜色之间插值fixed4finalColor=lerp(baseColor,blendedColor,_Opacity);returnfinalColor;}ENDCG}}FallBack"Diffuse"}```说明:-这个Shader定义了两个纹理:_MainTex(基础纹理)和_BlendTex(用于混合的纹理),以及一个控制混合强度的_Opacity参数。-在片段着色器中,首先分别采样两个纹理。-然后,对采样的颜色值进行逐通道相乘(即正片叠底公式)。-最后,使用lerp函数根据_Opacity的值在原始颜色和混合后的颜色之间进行插值。当_Opacity为0时,显示原始基础纹理;为1时,完全显示混合结果;在0到1之间则是两者的混合。这样,我们就可以在Unity中实现类似Photoshop正片叠底混合效果。§§相关问题§§1.如何在Unity中实现其他混合模式,例如屏幕(滤色)、叠加等?2.如何在UnityShader中处理透明通道的混合?3.如何优化混合Shader以支持移动设备?</think> ### Unity 实现 Photoshop 正片叠底混合模式的Shader代码 在Unity中实现Photoshop正片叠底(Multiply)混合模式的Shader代码如下,基于Photoshop正片叠底公式 **结果颜色 = 基础颜色 × 混合颜色**: ```glsl Shader "Custom/MultiplyBlendMode" { Properties { _MainTex ("Base Texture", 2D) = "white" {} _BlendTex ("Blend Texture", 2D) = "white" {} _Opacity ("Blend Opacity", Range(0,1)) = 1.0 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; sampler2D _BlendTex; float _Opacity; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } // 正片叠底核心算法 fixed3 MultiplyBlend(fixed3 base, fixed3 blend) { return base * blend; // 分量乘法公式 } fixed4 frag (v2f i) : SV_Target { // 采样基础纹理和混合纹理 fixed4 base = tex2D(_MainTex, i.uv); fixed4 blend = tex2D(_BlendTex, i.uv); // 应用正片叠底混合 fixed3 blendedColor = MultiplyBlend(base.rgb, blend.rgb); // 混合强度控制 blendedColor = lerp(base.rgb, blendedColor, _Opacity); return fixed4(blendedColor, base.a); } ENDCG } } } ``` #### 使用说明: 1. **核心算法**:`MultiplyBlend()` 函数实现正片叠底计算,对RGB三个通道分别执行基础色×混合色 2. **参数控制**: - `_MainTex`:基础纹理 - `_BlendTex`:混合纹理 - `_Opacity`:混合透明度(0.0 = 完全不混合,1.0 = 完全混合) 3. **效果特点**:混合后颜色总比原始颜色更暗(两数相乘在[0,1]区间内结果更小) #### 应用示例: ```csharp // C#脚本中设置混合纹理 Material blendMaterial = GetComponent<Renderer>().material; blendMaterial.SetTexture("_BlendTex", yourBlendTexture); blendMaterial.SetFloat("_Opacity", 0.8f); // 80%混合强度 ``` > 提示:在PSO软件中验证效果时,可通过比较Photoshop正片叠底Shader处理结果,确保算法一致性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值