2019-12-06 Unity Shader Alpha测试/Alpha混合
主要是为了记录一下学习的历程,以便于之后回顾和检视,而且也能强化一下理解。
之前的贴图部分之后再补上吧。
直接上代码和效果
Alpha test 透明度测试
工作原理: 如果一个片元的透明的(alpha值,a值)不满足条件(通常是小于某个阈值),则它对应的片元就会被舍弃,而且被舍弃的片元对颜色缓冲区不产生任何影响(相当于不会被渲染/从渲染队列剔除?)。否则则会被当成正常不透明物体来处理。
透明度测试的函数:
void clip(float x){
if(any(x<0))
discard;//即舍弃该片元
}
代码来



SubShader中的Tags有三个标签必须声明,分别代表了归组(TransparentCutout组),渲染队列(AlphaTest) 是否不受投影器(Projector)影响

关键处在此,该处的clip函数拓展开来如下
if((texColor.a - _Cutoff) < 0)
discord;
即如果该片元的a值减去_Cutoff设定的值后小于0,则就会被舍弃。
在此之前和之后的代码与之前的没有变化,Alpha测试只是片元着色器中的一环。

最后使用的Fallback是内置的VertexLit,该SubShader保证了使用透明度测试的物体可以正确的先其他物体投射阴影。


但是显然这个可能存在渲染的问题,在视角透过被舍弃的片元后, 后面的片元没有被渲染出来(也可能是cube没有设置内部的渲染)
但Alpha测试不会得到真正的透明效果,它只是通过Alpha测试来筛选片元。

透明度混合
该方法能够真正实现透明的效果
原理是使用当前片元的透明度作为混合因子,与颜色缓冲区存在的颜色值进行混合得到新的颜色。
但是Alpha Blend需要关闭ZWrite(深度写入),即透明物体不会记录深度值到深度缓冲区,它无法影响到之前和之后的物体的渲染。
其实实现也比较简单,也是在fragment shader中进行一些计算(BLEND)

选取一些段落分析

_AlphaScale就是整体的透明度,声明后可以在Inspector中调节

SubShader中的渲染队列Queue改为Transparent,归到Transparent组中。RenderType通常用于着色器替换。

关闭深度写入/设置混合模式与混合因子。SrcAlpha为源颜色的混合因子,OneMinusSrcAlpha为目标颜色(存在于颜色缓冲区的颜色)的混合因子。
DstColor = SrcAlpha * SrcColor + (1 - SrcAlpha) * DstColor

相比上个Alpha Test存在两个改动,即去掉了Clip函数,将返回值中第四个变量1.0换成了 texColor.a * _AlphaScale,即能够使用声明的_AlphaScale来乘片元的a变量,改变片元的透明度。
