2019-12-7 深度写入下的半透明效果/混合命令
之前的透明度混合是存在bug的,因为关闭了深度写入(ZWrite) ,所有模型自身会对自身产生透明效果(即视野内模型的重复处, 如下)

而解决它的方法就是使用两个Pass,一个是正常的关闭深度写入的AlphaBlend,另一个则是开启深度写入并但是不输出颜色, 它的目的仅仅是为了把该模型的深度值写入深度缓冲之中;而之后的Pass就可以按照像素级别的深度排序结果进行透明渲染。

开启深度写入后的Alpha混合就不会出现物体自身对自身的透明了。
ColorMask的意义在于,它之后的值代表着颜色通道的掩码(R,G,B,A),而当它之后的数字为0时,则该Pass不会写入任何颜色通道,也不会输入任何颜色。
混合命令
只需要理解这一个公式
O(输出)= SrcFactor(源颜色的混合因子)* S (source color源颜色) + DstFactor(目标颜色/缓冲区颜色的混合因子)* D(destination color 目标颜色/缓冲区颜色)
O.a的输入输出同理,只是a代表的是alpha值而已。
即 输出等于输入颜色乘输入混合因子 加上 目标颜色乘输出混合因子
而这些混合因子只是一个参数,它可以是one zero srcColor SrcAlpha等等等等
混合语句真正在代码中的实现:
Blend SrcFactor DstFactor SrcFatcotA DstFactorA
例如:
Blend SrcAlpha OneMinusSrcAlpha, One Zero
其中
SrcAlpha:源颜色的混合因子
OneMinusSrcAlpha:目标颜色的混合因子
One:源a值的混合因子
Zero:目标a值的混合因子
该命令代表混合后输出的颜色的透明度为源颜色的透明度
然而,混合命令除了默认的Add操作之外,还可以指定其他的操作,例如Sub,RevSub(混合后的源颜色减去混合后的目标颜色),Max,Min等等。
双面渲染效果
两种效果下实现实现
第一种是在Alpha测试下,关闭Cull(剔除)功能,即渲染双面。

可以直接得到不透明物体的内部渲染效果

另一种是在Alpha混合下,这个情况下由于关闭了ZWrite,所以无法使用单独关闭Cull的方法。
解决方法是使用另一个Pass,分别剔除前面Cull Front,剔除后面 Cull Back
这样得到了渲染了双面的效果。
