3.2混合模式+剔除

一、什么是混合模式?

混合的定义:(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值