年度总结之一:半透物体处理

好久没写了,这段时间相对较闲,把前段时间遇到的问题和解决方法及后续的问题进行梳理和总结,也算是2010年度总结吧。

        这次先从半透明物体的渲染说起 ,为了方便期间,分以下几种常遇到的情况来讨论:

 

<1> 半透物体极少,只有一两个,其相互之间也不会出现重叠。

 

这也是最简单的一种情况。先渲染不透明的物体,然后开启alphablend,禁止深度写和alphatest,再渲染半透物体,即可。看起来问题就解决了。但是在实现的时候会发现一些问题。下面以我们引擎中遇到的一些问题进行解释。我们要实现的效果是当玩家按下某个快捷键,场景中的其他玩家会逐渐出现或渐渐消失,为的是让低配玩家也能在人物较多的场景顺畅的游戏。在按照上面的渲染方法,结果发现,人物和场景之间的渲染顺序是正确了,但是人物自身的渲染却出现了问题。具体来说就是,从正面看,人的头发感觉像是出现在脸的前面。怀疑,是不是人物自身的mesh没有做排序造成的呢。但是目前的mesh是不支持排序的,要想做支持排序的mesh也可以,就是得重新导模型,很是麻烦。后来发现,就算是人物模型mesh内部进行了排序,渲染顺序正确,其渲染结果也不一定好。真正的原因是人物模型各个部分的颜色的搭配相差太大。比如,脸是白色的,头发是黑色的,就算是排序正确,的到的最终的结果恐怕也好看不到哪里去。后来借鉴了一下魔兽中的白牛的实现,发现他的半透也是有问题的,但是他的效果是可以接受的,原因是他的整个模型的颜色比较一致,这样就在资源的涉及层面解决了问题。现在改资源对我们来说是绝对不行的,只能想其他办法,跟同事简单商量后的到一个方案。那就是如果通过人物的脸,看到的直接是后面的场景,而不是头发,这种效果是不是可以的呢,让玩家仍然觉得是半透的,但是自身部件之间是不透的。有了目标,方案马上也就出来了,先关闭颜色写,打开深度写,渲染一遍人物模型,在关闭深度写,打开颜色写,开启alphablend,再次渲染人物模型。结果证明我们的效果是还可以接受的。但是又发现在人物某些部位出现空洞。后来发现这些是模型上的半透部分,如袖口等不规则的边缘处,这是就多出来一个规则的边。原因如下,在第一次渲染时,由于只是渲染深度信息,默认是开启alphatest,阈值是0.4,人物上的半透部分不会被写的深度缓冲,也就是说,第一次的渲染是正确的。第二次渲染人物模型时,打开了alphablend,这时alphatest被关闭了,而深度测试条件使用的是小于等于,这是原来的在袖口上层的半透部分就会通过测试,显示了出来,把深度测试条件改为等于,问题就解决了。

 

       后续问题:

       在景深效果开大时,如果人物alpha值很低,那么透过人物的背景的深度会出错,出现诡异的现象,人物后面的场景没模糊,周边的模糊。

 

<2> 多层透明物体的渲染。

 

        这种情况出现在大量粒子特效的场景中。按照原来的思路,对多层的透明物体进行排序,但是,物体交叉时就没法排序了。看到过一篇文章GDC2007_Meshkin_Houman_SortIndependentAlphaBlending,下面简述思路:

       就是对多层的透明物体的混合公式进行展开,重组织,分出排序无关的部分和排序相关的部分,然后发现,alpha值越小,排序相关部分的值越趋于0. 于是,他就用排序无关部分的公式最为最终的混合公式。

      其优点就是不用进行排序,简化了算法。但是缺点是只能在alpha值较低的而且要求不是很高的场景中使用。

 

目前讨论的,透明物体渲染还都没涉及到光照,关于这部分,在以后再讨论。

 

 

 

你可能感兴趣的:(年度总结之一:半透物体处理)