近期热门
粉丝908
关注 204
获赞 1005
Fog Of War shader(战争迷雾)【转】

[U3D] Fog Of War shader(战争迷雾)【转】

[复制链接]
13914 11 0 1 12年前 举报
作者 shallway 发表于 八 13, 2012 有0个评论
                                                                                                                        0.jpg
花了几天时间,从想法到实现,做出了比较完美的效果,还是挺有成就感的。首先,网上有分享解决方案,但是太繁琐,需要生成mesh来表现雾,而且效果很差。unity asset store上也有卖的,价钱高至75刀,而且我看了介绍,其解决方案也是生成mesh。如果对Post Image Effects有了解,那么很容易想到战争迷雾肯定就是一个全屏shader而已,何必那么麻烦呢。so,带着这个想法,做出了这个东西,我把它集成在Xffect Editor Pro 1.3.0里了,花75刀的价钱不仅能买到同等价钱的战争迷雾,还外带了一个特效编辑器,怎能错过~呵呵,不说废话了,我写这篇文章还是要分享自己的思路的,希望对读者有帮助。
首先,我们在玩RTS游戏时,地图的探索并显示的方式看起来像什么?
1.jpg
对,就像在PS里用笔刷工具画图一样。。
那么,我们可不可以在游戏里存储一张类似的贴图,然后把各个物体的世界坐标投射到XZ平面上,如果在白色区域内的则显示,否则就显示战争迷雾。
接下来,我们需要解决两个问题:
1,如何生成这个贴图?
2,如何从一个屏幕里取得每个像素的世界坐标?
一,生成可见区域贴图:
我们只需要跟踪一个client,并定义一个半径。当client移动的时候,以它的XZ坐标为半径画一个圆形区域,代表可见区域,不断累加后就相当于是用笔刷画图了。需要注意的是,Texture2D.Apply()是非常昂贵的,所以需要保证:贴图不可过大;贴图只需要8位,存储alpha数据即可
二,从屏幕获得每个像素的世界坐标
实际上这个问题已经有很多解决方案了(Reconstruct Position),但是由于引擎差异,我尝试了很久,通用解决方案都以失败告终。后来发现了unity自带的Image Effect: GlobalFog.js,里面提供了最快的解决方案。copy过来即可用,但是有一个问题:不支持AA!我也不知道是什么原因,即便是unity自带的GlobalFog也不支持AA,而unity官方也没有给出任何说明。而且由于这个解决方案需要depth texture,而mobile是不会自动生成它的,所以暂时不支持mobile。但是若要用在mobile上,也是有办法的,可以自己写pixel shader生成depth texture。
剩下的问题就是把每个像素映射到可见贴图里,从而决定该像素是否可见,当然,为了美观,还得加一些边缘blur效果。
over,最后放上一个demo视频,包含教程:
http://v.youku.com/v_show/id_XNDM4NjY1NTg4.html


转自:http://shallway.net/blog/fog-of- ... %E8%BF%B7%E9%9B%BE/

                                                       
0
点赞
0
打赏
1
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论11
您需要登录后才可以回帖 登录

没有看懂{:7_277:}{:7_277:}
10年前
回复

使用道具 举报

10年前
回复

使用道具 举报

CGJOY网友 
{:7_256:}
11年前
回复

使用道具

先留个名慢慢学习{:7_268:}
11年前
回复

使用道具 举报

很好~~~
11年前
回复

使用道具 举报

感觉还不错
11年前
回复

使用道具 举报

MAN
能把源代码发的看下吗

11年前
回复

使用道具 举报

相当的支持啊
11年前
回复

使用道具 举报

现在正好要做这个效果
可以好好研究下
11年前
回复

使用道具 举报

Post Image Effects还真没注意过,现在研究下。
12年前
回复

使用道具 举报

数据加载中....
没有更多评论了
您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器