Shader命令——Blend 混合

本文深入解析Unity中的BlendAPI,探讨其在透明渲染中的应用及计算公式。从SrcColor到DstAlpha,再到各种Blend模式如传统透明、预乘透明等,以及BlendOp指令的详细说明,帮助读者理解并掌握Unity渲染管线中透明效果的实现。

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

Unity官网Blend API介绍  https://docs.unity3d.com/Manual/SL-Blend.html

Blend透明渲染这块有点头疼。知道参数,还不是很明白计算公式。后续学会的话,来更新文章

 

 

SrcColor  要渲染得颜色 

SrcAplha  要渲染的透明度

 

DstColor 已经再屏幕上显示的颜色

DstAlpha 已经再屏幕上显示得颜色透明度

 

One MinusSrcColor   1减去要渲染的颜色

OneMinusSrcAlpha   1减去要渲染的透明度

One MinusDstColor 1减去屏幕上显示的颜色

OneMinusDstAlpha 1减去屏幕上显示的颜色​​​​​​​的透明度

 

解释:

Blend SrcAlpha OneMinusSrcAlpha

要渲染的颜色 * 要渲染的颜色透明度 + (1-要渲染的颜色透明度)*Gubffer的像素

常用命令

Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency 

Blend One OneMinusSrcAlpha // Premultiplied transparency

Blend One One // Additive

Blend OneMinusDstColor One // Soft Additive

Blend DstColor Zero // Multiplicative

Blend DstColor SrcColor // 2x Multiplicative

 

 

BlendOp  当这个指令存在,则Blend 指令失效

AddAdd source and destination together.
SubSubtract destination from source.
RevSubSubtract source from destination.
MinUse the smaller of source and destination.
MaxUse the larger of source and destination.
LogicalClearLogical operation: Clear (0) DX11.1 only.
LogicalSetLogical operation: Set (1) DX11.1 only.
LogicalCopyLogical operation: Copy (s) DX11.1 only.
LogicalCopyInvertedLogical operation: Copy inverted (!s) DX11.1 only.
LogicalNoopLogical operation: Noop (d) DX11.1 only.
LogicalInvertLogical operation: Invert (!d) DX11.1 only.
LogicalAndLogical operation: And (s & d) DX11.1 only.
LogicalNandLogical operation: Nand !(s & d) DX11.1 only.
LogicalOrLogical operation: Or (s | d) DX11.1 only.
LogicalNorLogical operation: Nor !(s | d) DX11.1 only.
LogicalXorLogical operation: Xor (s ^ d) DX11.1 only.
LogicalEquivLogical operation: Equivalence !(s ^ d) DX11.1 only.
LogicalAndReverseLogical operation: Reverse And (s & !d) DX11.1 only.
LogicalAndInvertedLogical operation: Inverted And (!s & d) DX11.1 only.
LogicalOrReverseLogical operation: Reverse Or (s | !d) DX11.1 only.
LogicalOrInvertedLogical operation: Inverted Or (!s | d) DX11.1 only.
### 实现透明度混合 为了在 Unity 的 Shader 中启用透明度混合,需配置特定的属性和标签。SubShader 应该设置 `Tags` 来指定渲染队列和其他参数[^1]。 ```cg SubShader { Tags { "Queue"="Transparent" "RenderType"="Opaque" } } ``` 接着,在 Pass 内部定义深度测试行为以及混合模式: - 使用 `ZWrite Off` 表明不再更新深度缓冲区。 - 设置 `Blend SrcAlpha OneMinusSrcAlpha` 启动 Alpha 淤合操作,允许像素按照其 alpha 值与其他图层组合。 ```cg Pass { ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM ... ENDCG } ``` 当处理特殊场景下的半透明效果时,可以考虑使用双 Pass 方法来先执行一次仅用于深度写入的操作,随后再做实际的颜色输出并应用透明度混合[^3]。 #### 半透明对象的深度写入策略 对于某些情况,可能希望即使是在绘制半透明物体的时候也能够保留原有的深度信息以便后续正确排序其他几何体。此时可以在第一个 Pass 中开启深度写入(`ZWrite On`) 并禁用颜色输出 (`ColorMask 0`) ,而在第二个 Pass 执行正常的透明度混合逻辑。 ```cg SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} Pass { ZWrite On ColorMask 0 } Pass { ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM ... ENDCG } } ``` 这种做法虽然解决了部分问题,但也引入了额外开销——增加了渲染调用次数,因此应当权衡利弊后再决定是否采用此方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值