混合是用来制作透明物体的。在所有着色器执行完毕,所有纹理都被应用,所有像素准备被呈现到屏幕之后,使用Blend命令来操作这些像素进行混合。
混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定Alpha值。物体的绘制顺序会影响到OpenGL的混合处理。Blend常用语法如下所列。
Blend Off
关闭混合
Blend 源因子 目标因子
配置并开启混合。计算产生的颜色和源因子相乘。颜色缓冲中的颜色和目标因子相乘,然后两个颜色相加。
Blend 源因子 目标因子,源因子A目标因子A
源因子,目标因子和上面相同,但是源因子A,目标因子A这些因子使用alpha通道进行混合。
BlendOp 操作
不是将加入的颜色混合在一起,而是对它们做一些操作。主要操作命令有Min(取最小值),Max(取最大值),Sub(求和),RevSub
常用的混合因子(对源因子和目标因子都有效)如表所示。
混合因子
| 混合因子 | 说明 |
| One | 值为1,使用此设置来让源或是目标颜色完全地通过 |
| Zero | 值为0,使用此设置来删除源或目标值 |
| SrcColor | 此阶段的值是乘以源颜色的值 |
| SrcAlpha | 此阶段的值是乘以源alpha的值 |
|
DstColor |
此阶段的值是乘以帧缓冲区目标颜色的值 |
| DstAlpha | 此阶段的值是乘以缓冲区目标alpha的值 |
| OneMinusSrcColor | 此阶段的值是乘以(1 - 源颜色) |
| OneMinusSrcAlpha |
此阶段的值是乘以(1 - 源alpha) |
| OneMinusDstColor |
此阶段的值是乘以(1 - 目标颜色) |
| OneMinusDstAlpha |
此阶段的值是乘以(1 - 目标alpha) |
Blend SrcAlpha OneMinusSrcAlpha //混合
Blend One One //相加混合
Blend One OneMinusDstColor //柔和相加混合
Blend DstColor Zero //相乘混合
Blend DstColor SrcColor //2倍相乘混合
下面的代码是一个能够渲染出玻璃特效的着色器代码:
Shader "Glass" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Transparency (A)", 2D) = "white" { }
//定义立方图纹理属性
_Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
}
SubShader {
Tag { "Queue" = "Transparent" }//设置渲染队列为透明队列
Pass {
Blend SrcAlpha OneMinusSrcAlpha //设置混合模式
Material {
Diffuse [_Color] //设置漫反射光颜色
}
Lighting On //开启光照
SetTexture [_MainTex] {
combine texture * primary double, texture * primary
}
}
Pass {
Blend One One //设置混合模式
Material {
Diffuse [_Color]
}
Lighting On
SetTexture [_Reflections] {//设置纹理应用
combine texture
Matrix [_Reflection]
}
}
}
}