笔记16 图形 3.2 混合模式及剔除
什么是混合模式?
混合的定义:(Blend)就是把两种颜色混在一起。具体就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式或者算法混在一起,从而实现新的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色。例如PS内的图片叠加,正片叠底,都属于混合模式的一种。
最终颜色 = Shader计算后的颜色值 * 源因子(SrcFactor)+累积颜色* 目标因子(DstFactor)
累计颜色可以理解为渲染当前物体后面的颜色,即GBuffer中的像素,比如你的背景,还有身后的物体。
混合模式控制的就是源因子和目标因子:Blend SrcFactor DstFactor
混合模式有哪些?
PS 内的混合模式
点击展开
Normal 正常
Darken 变暗
Multiply 正片叠底
Linear Burn 线性加深
Color Burn 颜色加深
Darker Color深色
Lighten 变亮
Screen 滤色
Color Dodge 颜色减淡
Linear Dodge 线性减淡
Lighter Color 浅色
Overlay 叠加
Soft Light 柔光
Hard Light 强光
Vivid Light 亮光
Linear Light 线性光
Pin Light 点光
Hard Mix 实色混合
Difference 差值
Exclusion 排除
Subtract 减去
Divide 划分
Hue 色相
Saturation 饱和度
Color颜色
Luminosity 明度
ShaderLab 内的混合
1.如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考越界的间题。
2.在所有若色器执行完毕,所有纹理都被应用,所有像素准备被呈现到屏幕之后,使用Blend命令来操作这些像素进行混合。
3.语法
- Blend Off
- 关闭blend混合(默认值)
- Blend SrcFactor DstFactor
- 配置并启动混合。Shader产生的颜色被乘以SrcFactor.
- 已存在于屏幕的颜色乘以DstFactor,并且两者将被加在一起。
- Blend SrcFactor DstFactor,SrcFactorA DstFactorA
- 同上,但是使用不同的要素来混合alpha通道。
- BlendOp Value
- 如果使用BlendOp命令,则混合操作将设置为该值。否则,混合操作默认为Add。
- 不是添加混合颜色在一起,而是对它们做不同的操作。
- BlendOp OpColor,OpAlpha
- 同上,但是使用不同的操作来处理alpha通道
- AlphaToMaskOn
- 常用在开启多重渲染(MSAA)的地表植被的渲染
Blend 命令
(来自Unity文档)
虽然所有图形API和硬件都支持混合功能,但对某些混合操作的支持较为有限。
混合等式为:
1 | finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue |
注意:
1.任何指定渲染目标的签名都需要OpenGL4.0+、GL_ARB_draw_buffers_blend 或 OpenGL ES 3.2。
2.RGB和Alpha混合与高级OpenGL混合操作不兼容。
BlendOp 命令
指定Blend命令使用的混合操作。要使该命令生效,在同一个Pass代码块(如果该命令在Pass代码块中)或SubShader代码块(如果该命令在SubShader代码块中)中还必须有一个Blend命令。
并非所有设备都支持所有混合操作,支持取决于图形API和硬件。对对于不支持的混合操作,不同的图形API以不同的方式处理:GL跳过不支持的操作,Vulkan和Metal回退到Add操作。
…(搬文档干嘛)
常用基础混合类型
BlendSrcAlphaOneMinusSrcAlpha
//Alphablending alpha混合
Blend One One
//Additive 相加混合
Blend One OneMinusDstColor
//SoftAdditive 柔和相加混合
Blend DstColor Zero
//Multiplicative 相乘混合
Blend DstColor SrcColor
//2xMultiplicative 2倍相乘混合
Blend One OneMinusSrcAlpha
//Premultiplied transparency 预乘透明度
混合模式的实现
Unity内对于Blend自带的枚举
1 | //Properties |
在Unity中实现PhotoShop 混合模式
(这差不多就是作业)
- normal: Dst.rgb
- alpha: Src.a*Src+(1.0-Src.a)*Dst
(待补充)
什么是剔除?
法线剔除:也称为背面消隐,根据法线朝向判断哪个面被剔除掉。
可以用来控制是否双面渲染。
语法:Cull
可以接Off/Front/Back
面裁切:clip函数会将参数小于某像素点直接在片元阶段丢弃掉,常用于制作溶解,裁剪等效果。
语法:clip();默认会切掉0.5的部分。
或者使用 if
1 | if (input.posInObjectCoords.y > 0.5){ |
用属性控制
1 | [Enum(UnityEngine.Rendering.CullMode)]_CullMode ("CullMode", float)=2 |
总结
这节内容不多,Blend 和 Cull 在 《Unity Shader 入门精要》里的不同章节里讲过。
-作业-
实现常用的混合模式,并设计使用界面。
- 标题: 笔记16 图形 3.2 混合模式及剔除
- 作者: 铁名_IronName
- 创建于 : 2026-03-25 17:24:44
- 更新于 : 2026-03-25 19:11:48
- 链接: https://blog.ironname.top/2026/BRPlan/笔记16-技术美术百人计划/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。