混合与剔除

宁睿  金牌会员 | 2022-6-25 11:34:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 570|帖子 570|积分 1718

混合

把两种颜色混在一起。具体就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式或者算法混在一起,从而实现新的效果。
最终颜色= Shader计算后的颜色值*源因子(SrcFactor) +累积颜色*目标因子(DstFactor)
累计颜色可以理解为渲染当前物体后面的颜色即GBuffer中的像素,比如你的背景,还有身后的物体。混合模式控制的就是源因子和目标因子,在脚本里会看到的就是Blend SrcFactor DstFactor
混合模式
     ShaderLab内的混合命令  

ShaderLab 命令:Blend - Unity 手册 (unity3d.com)https://docs.unity3d.com/cn/current/Manual/SL-Blend.html
ShaderLab 命令:BlendOp - Unity 手册 (unity3d.com)https://docs.unity3d.com/cn/current/Manual/SL-BlendOp.html
   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混合操作不兼容。
  Unity内对于Blend自带的枚举:Enum类
[Enum (UnityEngine. Rendering. BlendOp)]_ BlendOp ( BlendOp,Float) = 0
[Enum (UnityEngine. Rendering. BlendMode)]_ SrcBlend ( SrcBlend,Float) = 1
[Enum (UnityEngine. Rendering. BlendlMode)]_ DstBlend ( DstBlend, Float) = 0


  • Normal 图片正常叠加
  1. //正常
  2. float3 Normal(float3 Src, float3 Dst)
  3. {
  4.     Src = 0.;
  5.     return Dft.rgb + Src . rgb;
  6. }
复制代码



  •  alpha混合【Blend SrcAlpha OneMinusSrcAlpha】
  1. float3 ALphabLend(float4 Src, float4 Dst)
  2. {
  3.     float4 C = Src.a * Src + (1.0 - Src.a) * Dst;    //当前颜色*当前透明度+(1-当前透明度)*缓存颜色
  4.     return C.rgb;
  5. }
复制代码



  •  变暗【BlendOp Min   Blend One One】
  1. float3 Darken(float3 Src, float3 Dst )
  2. {
  3.     return min(Src, Dst);    //min(当前颜色,缓存颜色)* 1
  4. }
复制代码



  • Multiply正片叠底【Blend DSTColor Zero】
  1. float3 Multiply(float3 Src, float3 Dst)
  2. {
  3.     return Src * Dst;    //当前颜色*缓存颜色 + 缓存颜色*0
  4. }   
复制代码



  • Screen滤色【Blend OneMinusDstColor One或Blend One OneMinusSrcColor】
  1. float3 Screen(float3 Src, float3 Dst )
  2. {
  3.     return Src + Dst - Src寒Dst;    //当前颜色*(1-缓存颜色)+缓存颜色*1 或者 当前颜色*1+缓存颜色*(1-缓存颜色)
  4. }
复制代码



  •  Lighten变亮【BlendOp Max   Blend One One】
  1. float3 L ighten(float3 Src, float3 Dst)
  2. {
  3.     return max(Src, Dst);    //max(当前颜色,缓存颜色)
  4. }
复制代码



  •  LinerDodge线性减淡【B;end One One】
  1. float3 LinearDodge(float3 Src, float3 Dst)
  2. {
  3.     return Src + Dst;    //缓存颜色*1+当前颜色*1
  4. }
复制代码

 LinerBurn线性加深
  1. float3 L inearBurn(float3 Src, float3 Dst )
  2. {
  3.     return Src + Dst - 1.0;
  4. }
复制代码
剔除



  • 法线剔除:也称为背面消隐,根据法线朝向判断哪个面被剔除掉。可以用来控制是否双面渲染。
Cull Off(Front        Back)


  • 面裁切: cI ip函数会将参数小于某像素点直接在片元阶段丢弃掉,常用于制作溶解,裁剪等效果。
Clip 默认剔除0.5部分
剔除模式
[Enum (Uni tyEngine. Rendering. CullMode)]_ CullMode ( CullMode,float) = 2
   1.开启双面渲染相当于绘制了两次。
2. CI ip函数在某些PowerVR的机型上效率很低。
3.面裁切CI ip使用AIphaTest队列
  教程地址:【技术美术百人计划】图形 3.2 混合模式及剔除_哔哩哔哩_bilibili 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表