接上一篇中说的游戏,我们已经实现了client、host上的一个物体可见不可见的行为。之后我们可以加入类似检查两个单位之间的距离、或是两个单位之间有无阻挡物来进一步实现游戏机制。

在这篇随笔中我会首先介绍战争迷雾的一种绘制方法。下一篇中介绍Line of Sight模型的实时生成。两者结合后的最终的效果如下:

战争迷雾的绘制:

不同的绘制方法有很多,我们这里采取的是把战争迷雾的信息保存到贴图上,然后作为ImageEffect和最终图像融合。

在想要有迷雾遮罩的地方放上一个模型,然后将其图层设置为FowMask(仅做例子)。

将主相机中的Culling Mask中的FowMask取消勾选,这样这个模型不会被渲染到主相机里去。

然后新建一个相机作为渲染贴图的相机,称作Fow相机,作为主相机的child Gameobject,并且Culling Mask中只勾选FowMask。并设置Clear Flag和Background Color如下



这样保证在渲染出的图像中,除了遮罩模型的地方其他区域alpha都为0。因为我们接下来要用到alpha表示一个区域是否有遮罩。

在Fow相机下添加一个脚本

public class LosMaskSubCamera : MonoBehaviour {

	// Use this for initialization
void Start () {
var t = new RenderTexture(Screen.width, Screen.height, 16);
GetComponent<Camera>().targetTexture = t;
Shader.SetGlobalTexture("_LOSMaskTexture", t);
}
}

该脚本新建一张RenderTexture并且让相机渲染到这张texture中。同时把它作为Shader的输入。这里的Shader就是附在主相机上的image effect。

在主相机上添加一个脚本代码如下:

public class LosMask : MonoBehaviour {
public Material LOSMaskMaterial; private void OnRenderImage(RenderTexture source, RenderTexture destination) {
Graphics.Blit(source, destination, LOSMaskMaterial);
}
}

一个单纯的调用一个ImageEffect的代码。在之后完成Shader、创建Material之后再把Material赋值给它。

现在我们新建一个Shader。代码跟Image Effect模板相差无几,如下:

Shader "Custom/LOSMaskShader"
{
Properties
{
_MainTex("MainTex",2D) = "white"{}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
} sampler2D _LOSMaskTexture;
sampler2D _MainTex; fixed4 frag (v2f i) : SV_Target
{
float4 mask = tex2D(_LOSMaskTexture,i.uv);
float4 main = tex2D(_MainTex,i.uv); main = main * saturate(mask.a+0.2); //0.2代表不可见区域的可见度。也可以把它暴露成一个变量
return main;
}
ENDCG
}
}
}

代码非常简单,最终效果是_LOSMaskTexture中alpha值低的区域变暗。注意到mask里只用到了alpha通道,用剩下的rgb通道还可以做一些有趣的事情。

比如说给在迷雾地区显示点东西:



模糊是因为整个遮罩都被我模糊过了。

具体实现这里先略过。

之后新建一个Material赋值给主相机下的脚本就可以完成了。

要看到效果,需要新建一个模型,比如一个球体,然后把图层调整为FowMask。之后运行游戏就可以看到效果了。

如果需要平滑边缘可以加上高斯模糊。

我这里参考了一位大牛的博客:http://blog.csdn.net/u011047171/article/details/47977441 。直接粘在Fow相机下即可。

unity中绘制战争迷雾的更多相关文章

  1. Unity3D高性能战争迷雾实现

    效果图 先上效果图吧,这是为了吸引到你们的ヽ(。◕‿◕。)ノ゚ 战争迷雾效果演示图 战争调试界面演示图 由于是gif录制,为了压缩图片,帧率有点低,实际运行时,参数调整好是不会像这样一卡一顿的. 战争 ...

  2. Unity3D游戏高性能战争迷雾系统实现

    一 效果图 先上效果图吧,这是为了吸引到你们的ヽ(。◕‿◕。)ノ゚ 战争迷雾效果演示图 战争迷雾调试界面演示图 由于是gif录制,为了压缩图片,帧率有点低,实际运行时,参数调整好是不会像这样一卡一顿的 ...

  3. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...

  4. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  5. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  6. [转] AS3地图拼接与战争迷雾的实现

    在开发游戏的过程中,特别是地图编辑器中,需要利用最少的资源,实现最丰富的地形地貌.虽然现在众多的RPG开始使用整图,但是我们偶尔还是需要能够让玩家自己编辑地图,或者其他需要自动进行地图构建的功能.另外 ...

  7. 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...

  8. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  9. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

随机推荐

  1. ubuntu 14.04安装nginx+php

    转自:http://www.cnblogs.com/helinfeng/p/4219051.html 基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境,以下全 ...

  2. js滚动及可视区域的相关的操作

    element.getBoundingClientRect 判断指定元素相对于页面可视窗口的位置信息,通常结合windows.onScroll方法使用,当element.getBoundingClie ...

  3. 【廖雪峰老师python教程】——OOP

    概述 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 数据封装.继承和多态 ...

  4. spring mvc 返回xml格式数据

    1.问题 : 因为业务需要,需要发送xml格式的数据,使用spring mvc 自己解析,就不用费心去自己搞这些东西. 2.解决: 新建一个实体类,直接在实体类中添加注解即可,如下: @XmlRoot ...

  5. 「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)

    题目 分析 这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- - 不过问题也在我思维江化上.思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办.为什么要这么思考,因为这样思考最符合我们的 ...

  6. mysql字段名与关键字重复解决办法

    mysql 关键字与字段名相同,插入或者修改里会报错 解决办法: 1.改字段名,如果库里面表结构关系不复杂,修改字段名就解决 2.在插入或者修改字段时,字段名加上  ` 包上,注意:这里不是引号,是英 ...

  7. 10-Mysql数据库----数据的增删改

    本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识.那么在mysql中其实最 ...

  8. [spring+tomcat]启动时报错:NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

    一般来讲问题的原因为tomcat版本较低, 建议升级到tomcat7x 以上版本

  9. direct.h头文件(对目录操作)

    chdir()改变当前目录的函数原形:int chdir(const char *path)功能:把由path指定的目录改为当前目录.path参数中可以指定驱动器号,如“a:\\ddd”, 但只是改变 ...

  10. Aspose.Pdf合并图片到PDF文件

    将图片和PDF文件合成为新的PDF文件,可以先将图片转换为PDF文件, 然后合成PDF即可, 将图片转换成PDF文件有如下方法: Aspose.Pdf.Document Aspose.Pdf.Gene ...