【UnityShader】透明度混合

总述

  • 关闭深度写入,ZWrite Off,不会修改深度缓冲中的值,但不影响修改颜色缓冲中的值。原因:如果不关闭深度写入,就无法透过半透明表面看到后面的物体了。
  • 不需要关闭深度测试;
  • Unity 在使用 Blend (除去Blend Off)时,自动开启混合模式。
  • 混合是一个逐片元的操作,而且它不是可编程的,但却是高度可配置的。
  • 通常,使用了透明度混合的 Shader 都应该在SubShader 中设置这三个标签
    Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
  • FallBack "Transparent/VertexLit"

透明度混合基本原理

透明度混合可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是,透明度混合需要关闭深度写入,这使得我们要非常小心物体的渲染顺序。

透明度混合的实现

当片元着色器产生一个颜色的时候,可以选择与颜色缓存中的颜色进行混合。混合中的颜色值包含了 RGBA 四个通道的值。

Blend 命令

把当前自身的颜色和已经存在于颜色缓冲中的颜色值进行混合。

语义 描述
Blend Off 关闭混合
Blend SrcFactor DstFactor 开启混合,并设置混合因子,源颜色(该片元的颜色)*SrcFactor+目标颜色(缓冲中的)*DstFactor
Blend SrcFactor DstFactor,SrcFactorA DstFactorA 和上面几乎一样,只是使用不同的因子来混合透明通道
BlendOp BlendOperation 并非是把源颜色和目标颜色简单相加后混合,而是使用BlendOperation对它们进行其他操作

关闭深度写入带来的问题

当模型本身有复杂的遮挡关系或是包含了复杂的非凸网格的时候,就会有各种各样因为排序错误而产生的错误的透明效果。

这都是由于我们关闭了深度写入造成的,因为这样我们就无法对模型进行像素级别的深度排序。一种解决方法是分割网格,从而可以得到一个“质量优等”的网络。但很多情况下往往不切实际。这时,可以想办法重新利用深度写入,让模型可以像半透明物体一样进行淡入淡出。

开启深度写入的半透明效果

  • 由于关闭深度写入而造成错误排序的情况,一种解决方法是使用两个 Pass 来渲染模型:第一个Pass开启深度写入,但不输出颜色,它的目的仅仅是为了把该模型的深度值写入深度缓冲中;第二个Pass进行正常的透明度混合,由于上一个Pass已经得到了逐像素正确的深度信息,该Pass就可以按照像素级别的深度排序结果进行透明度渲染。
  • 缺点是多使用一个 Pass 会对性能造成一定的影响。
  • 新添加的Pass的目的是为了把模型的深度信息写入深度缓冲中,从而剔除模型中被自身遮挡的片元。

ColorMask

在 ShaderLab 中,ColorMask 用于设置颜色通道的写掩码(write mask),它的语义如下:

ColorMask RGB | A | 0 | 其他任何R、G、B、A的组合
  • 当 ColorMask 设为0时,意味着该Pass不写入任何颜色通道,即不会输出任何颜色。
  • ColorMask R,意思是输出颜色中只有R通道会被写入
  • ColorMask 0,意思是不会输出任何颜色
  • 默认值为RGBA,即四个通道都写入

ShaderLab的混合命令

源颜色(source color):指的

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值