CG游麟网官方站
查看: 17190|回复: 39

[着色阴影] 在U3D中实现战争迷雾

  [复制链接]

172

主题

181

帖子

2736

积分

名动江湖

Rank: 6Rank: 6

麒麟币
2555
任务币
0
威望
0
贡献
30
主题
172
在线时间
15 小时
发表于 2015-11-25 11:06:30 | 显示全部楼层 |阅读模式
在U3D中实现战争迷雾图片来源于网络.

在U3D中实现战争迷雾

在U3D中实现战争迷雾


一、简介
RTS类型的游戏经常用到战争迷雾。一开始整个地形被迷雾遮蔽,只有Viewer的周围一定范围可见,随着Viewer的移动,未探索的区域变成了可见。
二、实现方法
本人之前也没有实现过战争迷雾,但是一提到战争迷雾,我的第一反应是用RenderTexture来实现,几乎所有运算都是在屏幕空间中进行,绘制出迷雾Texture后,再用Projecter将迷雾Texture投射到整个场景,有点类似GPGPU的思想。方法的主要步骤如下:
1、创建一个RenderTexture(称为FogOfWarRTT)用于绘制(刷出)迷雾。
2、设置当前RenderBuffer为FogOfWarRTT,并且不清除该RenderBuffer,这就使得刷上去的迷雾不会被清除掉。
3、创建一个Projecter,用于将FogOfWarRTT投射到场景。
三、实现细节
  知道大致过程后,还有一些细节问题需要讨论,如下:
1、  创建好FogOfWarRTT后,应该怎么刷上迷雾呢?换句话说,当Viewer在场景中移动时,怎么样才能擦除FogOfWarRTT上黑色的迷雾?我们只是知道Viewer的世界坐标ViewerCenter,而在FogOfWarRTT上刷迷雾时,用的是屏幕空间的UV坐标,也就是说,怎么将ViewerCenter转化为屏幕空间的UV坐标?如下:
点击查看原图
点击查看原图
其中m_projMatrix是投影矩阵,m_viewMatrix是视图矩阵。这两个矩阵是怎么来的,下面再讨论。
2、  创建Projecter的视图矩阵ViewMatrix

创建视图矩阵的代码如下:
点击查看原图
点击查看原图

其中 look、up、right和pos都是世界坐标系下的。
3、  创建正交投影矩阵ProjMatrix。


Projecter投射FogOfWarRTT用的是正交投影矩阵。看到这里读者可能会有疑问,Projecter不是已经有投影矩阵了吗,直接用它的就好了呀,干嘛还这么费劲再自己编写呢? Projecter的正交投影空间是方形的,对于一些在XZ平面是比较狭长的场景,Projecter的正交投影空间包裹得就不是很严密,这就会造成FogOfWarRTT大量的像素浪费,也就是说FogOfWarRTT有相当大的一部分像素是没有用的,下面这图描述了用Projecter的投影矩阵在FogOfWarRTT上刷迷雾的缺陷。
点击查看原图
创建正交投影矩阵的代码如下:
点击查看原图
其中v3MaxInViewSpace、v3MinInViewSpace分别是场景区域在Projecter的视图空间中的最大坐标点和最小坐标点。
四、绘制迷雾。

有了Projecter的ViewMatrix和ProjMatrix后,最后一步就是绘制迷雾,下面是绘制迷雾的PixelShader的代码:
点击查看原图
half4 _ViewCenter; //x,y是Viewer的世界坐标转换成的屏幕空间UV坐标,z刷子的半径,w刷子边缘柔和程度
  
half  _BufferAspect; //场景矩形区域的横纵比
  
half  _FogDensity;  //迷雾浓度
sampler2D _NoiseTex; //Perlin噪音,对圆形的刷子进行抖动,使之变得不太规则。
图片:例子.jpg
点击查看原图



楼主热帖
回复

使用道具 举报

8

主题

1493

帖子

3245

积分

大名鼎鼎

Rank: 7Rank: 7Rank: 7

麒麟币
1749
任务币
0
威望
0
贡献
1
主题
8
在线时间
528 小时
发表于 2015-11-25 13:34:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

361

帖子

976

积分

声名鹊起

Rank: 4

麒麟币
604
任务币
15
威望
0
贡献
0
主题
0
在线时间
52 小时
发表于 2015-11-25 23:15:09 | 显示全部楼层
CG游麟网真是个很好的学习天堂!
回复 支持 反对

使用道具 举报

1

主题

374

帖子

418

积分

小有名气

Rank: 3Rank: 3

麒麟币
25
任务币
35
威望
2
贡献
10
主题
1
在线时间
20 小时

最佳新人

发表于 2015-11-26 08:43:38 | 显示全部楼层
好像不错的样子~支持~
回复 支持 反对

使用道具 举报

5

主题

3975

帖子

5955

积分

誉满一方

Rank: 8Rank: 8

麒麟币
1992
任务币
235
威望
0
贡献
0
主题
5
在线时间
321 小时

忠实会员最佳新人

发表于 2015-11-26 08:59:07 | 显示全部楼层
CG游麟网真的很棒,我喜欢。
回复 支持 反对

使用道具 举报

0

主题

4867

帖子

1万

积分

蜚声中外

Rank: 13Rank: 13Rank: 13Rank: 13

麒麟币
12539
任务币
0
威望
0
贡献
0
主题
0
在线时间
305 小时
发表于 2015-11-26 09:45:19 | 显示全部楼层
棒棒的,感谢楼主分享。
回复 支持 反对

使用道具 举报

0

主题

483

帖子

2069

积分

名动江湖

Rank: 6Rank: 6

麒麟币
1576
任务币
0
威望
0
贡献
0
主题
0
在线时间
14 小时
发表于 2015-11-28 20:58:14 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

4

主题

196

帖子

1721

积分

名动江湖

Rank: 6Rank: 6

麒麟币
1525
任务币
35
威望
0
贡献
162
主题
4
在线时间
103 小时

最佳新人忠实会员

发表于 2015-12-8 09:19:32 | 显示全部楼层
酷酷酷酷酷酷酷酷酷酷酷酷酷酷酷
回复 支持 反对

使用道具 举报

0

主题

317

帖子

858

积分

声名鹊起

Rank: 4

麒麟币
533
任务币
20
威望
0
贡献
15
主题
0
在线时间
18 小时
发表于 2015-12-16 17:49:25 | 显示全部楼层
真的非常棒!
回复 支持 反对

使用道具 举报

0

主题

11

帖子

13

积分

初入江湖

Rank: 1

麒麟币
1
任务币
0
威望
0
贡献
0
主题
0
在线时间
0 小时
发表于 2015-12-16 18:23:08 | 显示全部楼层
厉害,向楼主学习!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
客服QQ:
47413829
新QQ群:
418757022
在线时间:周一至周五
9:00-22:00 Email:
47413829@qq.com
举报:网盘资源失效
在线客服
快速回复 返回顶部 返回列表