混合模式Blend
遇到的问题
Camera直接输出画面时,混合效果和混合公式对不上
New Scene中相关的信息:底图Quad_Bg是蓝色(0, 0, 1, 1),混合图Quad_Src是红色(1, 0, 0, 0.5),混合模式为Blend DstColor Zero, One Zero
(该混合方式最终颜色的计算方式:final_rgb = DstColor.rgb * SrcColor.rgb + 0 * DstColor.rgb,final_alpha = 1 * SrcColor.a + 0 * DstColor.a)
a) 混合正常的情况:只有将Camera的画面输出到RenderTexture时,混合效果才正常
红蓝相交的地方混合后:DstColor(0, 0, 1) * SrcColor(1, 0, 0) + 0 * DstColor = (0, 0, 0),rgb为黑色;1 * SrcAlpha(0.5) + 0 * DstAlpha = 0.5;最终为50%黑色
红色和相机背景白色混合后:DstColor(1, 1, 1) * SrcColor(1, 0, 0) = (1, 0, 0),rgb为红色;1 * SrcAlpha(0.5) + 0 * DstAlpha = 0.5;最终为50%红色
b) 原因分析:Camera直接输出画面(关掉Canvas,GameView看到的就是Main Camera的直接输出画面),他的alpha总是会被设置为1
红蓝相交的地方混合后:DstColor(0, 0, 1) * SrcColor(1, 0, 0) + 0 * DstColor = (0, 0, 0),rgb为黑色;alpha总是为1,所以为黑色
红色和相机背景白色混合后:DstColor(1, 1, 1) * SrcColor(1, 0, 0) = (1, 0, 0),rgb为红色;alpha总是为1,所以为红色
常见的一些混合效果(使用RenderTexture)
1) 用到的shader
注意:这边的alpha值使用额外的混合参数控制:Blend SrcFactor DstFactor, SrcFactorA DstFactorA
Shader "My/Blend2" { Properties { _MainTex("Texture", 2D) = "white" {} [Enum(UnityEngine.Rendering.BlendMode)]_SrcFactor("SrcFactor", int) = 5 //BlendMode.SrcAlpha [Enum(UnityEngine.Rendering.BlendMode)]_DstFactor("DstFactor", int) = 10 //BlendMode.OneMinusSrcAlpha [Enum(UnityEngine.Rendering.BlendMode)]_SrcFactorA("SrcFactorA", int) = 5 //BlendMode.SrcAlpha [Enum(UnityEngine.Rendering.BlendMode)]_DstFactorA("DstFactorA", int) = 10 //BlendMode.OneMinusSrcAlpha } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } ZWrite Off Blend[_SrcFactor] [_DstFactor], [_SrcFactorA] [_DstFactorA] 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; float4 _MainTex_ST; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 c = tex2D(_MainTex, i.uv); return c; } ENDCG } } }
2) 正常模式 Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha
final_rgba = SrcColor.a * SrcColor.rgba + (1 - SrcColor.a) * DstColor.rgba
3) 线性减淡 Blend One One, One One
final_rgba = 1 * SrcColor.rgba + 1 * DstColor.rgba
4) 正片叠底 Blend DstColor Zero, DstColor Zero
参考
【UnityShader】Blend混合模式 与 20余种颜色混合模式代码实现(多图预警) - 哔哩哔哩 (bilibili.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具