欢迎光临散文网 会员登陆 & 注册

2019-12-7 深度写入下的半透明效果/混合命令

2019-12-08 00:26 作者:winter_mute  | 我要投稿

之前的透明度混合是存在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

这样得到了渲染了双面的效果。


2019-12-7 深度写入下的半透明效果/混合命令的评论 (共 条)

分享到微博请遵守国家法律