一、什么是混合模式?
混合的定义:(Blend)就是把两种颜色混在一起。具体就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式或者算法混在一起,从而实现新的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色。例如PS内的图片叠加,正片叠底,都属于混合模式的一种。
最终颜色 = Shader计算后的颜色值* 源因子(SrcFactor) +累积颜色 * 目标因子(DstFactor)
累计颜色可以理解为渲染当前物体后面的颜色即GBuffer中的像素,比如你的背景,还有身后的物体。 混合模式控制的就是源因子和目标因子,在脚本里会看到的就是 :Blend SrcFactor DstFactor
二、混合模式有哪些类型?
1、PS中的混合模式类型
2、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)的地表植被的渲染
3.Blend & OpenOP
ShaderLab常用的混合模式
总结:
1.Blend命令 :启用混合会禁用 GPU 上的一些优化(主要是隐藏表面去除Early-Z)这会导致 GPU 帧时间增加。
2.混合操作默认为Add。
3.如果使用 BlendOp 命令,则混合操作将设置为该值。
4.混合方程
finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue
finalValue : 是 GPU 写入目标缓冲区的值,即最终混合结果。
sourceFactor :在混合命令中定义 ,即源因子。
sourceValue :是片段着色器输出的值,即当前Shader内的输出值。
operation :是混合操作,根据是否使用blend op决定。
destinationFactor :在混合命令中定义 ,即目标因子。
destinationValue :是目标缓冲区中已有的值,即目前的背景颜色或后面模型的颜色。
5. 单独的 RGB 和 alpha 混合与高级 OpenGL 混合操作不兼容。
最经常使用的非高级混合类型
1.Blend SrcAlpha OneMinusSrcAlpha
// Alphablending alpha混合
2.Blend One One
// Additive 相加混合
3.Blend One OneMinusDstColor
// Soft Additive柔和相加混合
4.Blend DstColor Zero
// Multiplicative 相乘混合
5.Blend DstColor SrcColor
// 2x Multiplicative 2倍相乘混合
6.Blend One OneMinusSrcAlpha
//Premultiplied transparency 预乘透明度
三、混合模式的实现方式?
1、普通的 Blend
Blend SrcAlpha OneMinusSrcAlpha
// Alphablending alpha混合
2、Unity内对于Blend自带的枚举
3、PhotoShop 混合模式实现方式
四、剔除的实现方式
什么是剔除?
法线剔除:也称为背面消隐,根据法线朝向判断哪个面被剔除掉。 可以用来控制是否双面渲染。
语法 : Cull 可以接 Off Front Back
面裁切:clip函数会将参数小于某像素点直接在片元阶段丢弃掉,常用于制作溶解,裁剪等效果。
语法 : Clip ();默认会切掉0.5的部分。 或者使用if
总结
1.开启双面渲染相当于绘制了两次。
2.Clip函数在某些PowerVR的机型上效率很低。
3.面裁切Clip使用AlphaTest队列
参考链接:
https://zhuanlan.zhihu.com/p/23905865
https://helpx.adobe.com/cn/photoshop/using/blending-modes.html https://www.jianshu.com/p/b1a6d6f6be56 https://www.bilibili.com/read/cv1874791