赞
踩
在shader中想让物体出现透明的地方有两种思路。
每经过一个pass物体就会产生一个临时颜色缓冲区(假设当前为M,上一个颜色缓冲区为N)。
Blend A B,C D 的含义就是混合后新的颜色缓冲区为 float4(AM.rgb+BN.rgb,CM.a+DN.a)
ABCD有许多可取的值,可取值中src含义为来自M值,而dst含义为来自N的值。
如srcalpha意思是M区域的a通道值。
需要注意的是Clip指令是逐像素操作,所以只能在像素着色器中使用。
Clip(x)如果x<0则当前像素舍弃。
思路一:使用Clip指令。
我们就拿三渲二来说,我们一般会有一个Pass要用来生成描边,所以这个pass会剔除掉正面。如果我们在最后一个pass中去clip会发现,描边产生的背面仍然存在,因为clip只是把当前pass的临时缓冲区的像素给裁剪掉了,所以如果想要达到溶解效果我们需要在每一个pass中去进行clip操作,这是十分麻烦的。同时也十分消耗性能。
思路二:使用Blend指令。
传递缓冲区的alpha信息,在第一个描边pass中使用blend srcalpha oneminusalpha,one zero来覆盖缓冲区的alpha信息,同时可以将上一个缓冲区的颜色通过alpha信息传递。在之后的pass中为了传递alpha信息 我们都可以使用blend dstalpha oneminusdstalpha,dstalpha zero来传递。这样我们就可以用第一个pass中的透明度来处理整个模型了。上图中我是使用了当前顶点的屏幕空间坐标来作为贴图采样uv值。你也可以使用顶点空间的uv来采样贴图获取沿模型的透明度变化,不过需要注意的是,如果是三渲二,如果第一个pass使用的是正面剔除,那么传递过来的透明通道值将会是采样的背面顶点的值,这样产生的效果好像模型凹进去了一样,所以建议可以使用一个pass,来传递alpha信息,而不传递color值。
思路三:制造透明的假象。grabpass
在最后一个pass处理前,使用grabpass来抓取屏幕的颜色信息,这样,就只需要对最后一个pass做clip或blend混合操作。
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。