转自:http://blog.163.com/wmk_2000_ren/blog/static/138846192201019114117466/php
实现呢,Aras大神已经给出了,缓存
http://forum.unity3d.com/threads/shadow-volumes-in-unity-on-the-wiki.9452/3d
http://wiki.unity3d.com/index.php/Shadow_Volumes_in_Alphablog
原理也有现成的论文解释清楚了。不能上谷歌,连接后面补...开发
我差很少就是用中文,把整个过程复述一下吧。源码
首先,之因此是基于alpha是由于模板缓存不是何时都能用,用alpha能够没必要担忧没有效果。这是用alpha来实现的缘由,虽然不必定能在项目中用,由于填充率比较高。it
思路以下:模板
第一步是将帧缓冲的alpha值变成四分之一。thread
第二步就是绘制阴影面了。正面的alpha值变为两倍,反面减半。这时候,阴影区域的alpha值变成1/2 和 1,而非阴影区不变。原理
第三步就是进行四次帧缓冲的操做,第一次是将alpha加倍,阴影区域的alpha值变成 1,其余区域变为1 / 2。 第二次是将alpha值反转,blend zero oneminusdstalpha 阴影区域的alpha值变为 0, 其余区域仍是1/2,第三次将alpha加倍,阴影区域的值仍是0,而后其余区域变成1,第四次就是把颜色赋上去了。
具体实现,会涉及一些细节,比较麻烦,慢慢补。
《untiy 3d ShaderLab 开发实战讲解》里面也有相关内容:源码在示例工程ShadowVolumes中