找回密码
 注册帐号

扫一扫,访问微社区

zhang273162308 Unity&Shader案例篇—地图上热图分布

294
回复
9428
查看
  [ 复制链接 ]
排名
141
昨日变化

121

主题

567

帖子

6910

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
5226
威望
0
注册时间
2013-9-10
在线时间
1489 小时
最后登录
2019-5-20

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

2018-7-9 18:25:58 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x

一、介绍

        在2维平面地图上随机或者指定位置生成一系列的热量、能源或者其他需要表示的信息的分布图。可以通过切换不同的贴图表示不同的信息,如图所示表示的是该地区的降水量的变化

heatMap.gif

如图所示为表示该地区的温度变化分布图

heatMap2.gif

二、实现

       在贴图的的某个位置处绘制指定半径的圆圈,然后调整圆圈的强度也即透明度。因此Shader部分会定义这两类变量,因为Shader里面不能定义没有长度的数组,只能一开始给个固定比较大的100作为初始长度,在代码里传这个数组变量的时候只要不超过这个数组的长度的参数都是可以的。当然你穿了101个数组的参数也不会报错,但是超出100的肯定也不会被shader代码使用到。代码

[C#] 纯文本查看 复制代码
			//自定义变量
			uniform int _Points_Length = 0;
			uniform float3 _Points[100];		// (x, y, z) = 位置
			uniform float2 _Properties[100];	// x = 半径, y = 透明度
			sampler2D _HeatTex;

然后,计算每个分布点位置相对世界坐标原地的距离,再结合强度就可以都到一个输出的透明度值。片段着色器代码为:

[C#] 纯文本查看 复制代码
			half4 frag(vertOutput output) : COLOR
			{
				half h = 0;
				for (int i = 0; i < _Points_Length; i++)
				{
					// 计算每一个分布点位置的距离
					half di = distance(output.worldPos, _Points[i].xyz);

					half ri = _Properties[i].x;
					half hi = 1 - saturate(di / ri);

					h += hi * _Properties[i].y;
				}

				
				h = saturate(h);
				half4 col = tex2D(_HeatTex, fixed2(h, 0.5));
				return col;
			}

接下来编写控制脚本,这里写了一个随机的位置、半径和强度。

最后要得到如上图所示的闪烁的热图效果,就是在已有的点位置上加一个噪声处理,如:

[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HeatMap : MonoBehaviour {

    [SerializeField] private int countPoint;
   [SerializeField] private Material heatMat;

    [SerializeField]
    private Vector4[] pointPoses;
    [SerializeField]
    private Vector4[] pointProper;

    
    private void Awake()
    {
        heatMat.SetFloatArray("_Points", new float[countPoint]);
    }
    // Use this for initialization
    void Start () {

        pointPoses = new Vector4[countPoint];
        pointProper = new Vector4[countPoint];

        for (int i = 0; i < pointPoses.Length; i++)
        {
            pointPoses[i] = new Vector2(Random.Range(-0.9f, 0.9f), Random.Range(-0.5f, 0.5f));
            pointProper[i] = new Vector2(Random.Range(0f, 0.25f), Random.Range(-0.25f, 1f)); // (Radius, Intensities)
        }

        heatMat.SetVectorArray("_Properties", pointProper);
        heatMat.SetInt("_Points_Length", countPoint);
	}
	
	// Update is called once per frame
	void Update () {
        for (int i = 0; i < countPoint; i++)
        {
            pointPoses[i] += new Vector4(Random.Range(-0.1f, +0.1f), Random.Range(-0.1f, +0.1f), 0f, 0f) * Time.deltaTime;
        }
        heatMat.SetVectorArray("_Points", pointPoses);
       // heatMat.SetVectorArray("_Properties", pointProper);
    }
}

三、总结

完整的工程文件下载地址为

游客,如果您要查看本帖隐藏内容请回复



回复

使用道具 举报

7日久生情
4079/5000
排名
142
昨日变化

11

主题

534

帖子

4079

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
52346
好友
0
蛮牛币
6026
威望
0
注册时间
2014-10-31
在线时间
1094 小时
最后登录
2019-5-21
2018-7-9 18:54:54 显示全部楼层
感谢分享  感谢分享
回复 支持 反对

使用道具 举报

7日久生情
2259/5000
排名
1393
昨日变化

0

主题

701

帖子

2259

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
54
威望
0
注册时间
2016-1-23
在线时间
668 小时
最后登录
2019-5-25
2018-7-9 19:07:35 显示全部楼层
u9ipoiuouiouioiuoiu
回复 支持 反对

使用道具 举报

4四处流浪
438/500
排名
8243
昨日变化

0

主题

225

帖子

438

积分

Rank: 4

UID
281167
好友
1
蛮牛币
883
威望
0
注册时间
2018-5-14
在线时间
65 小时
最后登录
2018-12-10
2018-7-9 19:30:27 显示全部楼层
感谢分享
回复

使用道具 举报

7日久生情
4399/5000
排名
167
昨日变化

19

主题

324

帖子

4399

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
67323
好友
1
蛮牛币
13976
威望
0
注册时间
2015-1-10
在线时间
1778 小时
最后登录
2019-5-26
2018-7-9 20:37:47 显示全部楼层
6666  最近也想搞 一堆这个东西
回复 支持 反对

使用道具 举报

排名
16593
昨日变化

0

主题

8

帖子

87

积分

Rank: 2Rank: 2

UID
275619
好友
0
蛮牛币
24
威望
0
注册时间
2018-4-4
在线时间
37 小时
最后登录
2018-7-23
2018-7-9 20:42:09 显示全部楼层
666666
回复

使用道具 举报

5熟悉之中
835/1000
排名
3485
昨日变化

0

主题

203

帖子

835

积分

Rank: 5Rank: 5

UID
114090
好友
0
蛮牛币
625
威望
0
注册时间
2015-7-18
在线时间
204 小时
最后登录
2019-5-24
2018-7-9 22:09:38 显示全部楼层
666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
4210/5000
排名
132
昨日变化

1

主题

536

帖子

4210

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
11004
好友
0
蛮牛币
4550
威望
0
注册时间
2013-12-24
在线时间
1289 小时
最后登录
2019-5-25

VIP

2018-7-9 22:54:51 显示全部楼层
这么好的东西。
回复

使用道具 举报

5熟悉之中
544/1000
排名
4909
昨日变化

0

主题

63

帖子

544

积分

Rank: 5Rank: 5

UID
272612
好友
1
蛮牛币
235
威望
0
注册时间
2018-3-15
在线时间
185 小时
最后登录
2019-3-16
2018-7-9 23:07:42 显示全部楼层
感谢分享
回复

使用道具 举报

7日久生情
4199/5000
排名
86
昨日变化

1

主题

421

帖子

4199

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
28000
好友
0
蛮牛币
4153
威望
0
注册时间
2014-6-4
在线时间
1131 小时
最后登录
2019-5-25
2018-7-9 23:46:10 显示全部楼层
谢谢~~~~~~~~~~~~
回复

使用道具 举报

6蛮牛粉丝
1270/1500
排名
1426
昨日变化

0

主题

69

帖子

1270

积分

Rank: 6Rank: 6Rank: 6

UID
3463
好友
2
蛮牛币
2354
威望
0
注册时间
2013-9-8
在线时间
327 小时
最后登录
2019-5-25
2018-7-10 05:22:55 显示全部楼层
謝謝分享,研究一下。
回复 支持 反对

使用道具 举报

4四处流浪
407/500
排名
5542
昨日变化

0

主题

49

帖子

407

积分

Rank: 4

UID
111073
好友
0
蛮牛币
654
威望
0
注册时间
2015-6-29
在线时间
102 小时
最后登录
2019-5-20
2018-7-10 07:58:31 显示全部楼层
感谢分享  感谢分享
回复 支持 反对

使用道具 举报

4四处流浪
407/500
排名
5542
昨日变化

0

主题

49

帖子

407

积分

Rank: 4

UID
111073
好友
0
蛮牛币
654
威望
0
注册时间
2015-6-29
在线时间
102 小时
最后登录
2019-5-20
2018-7-10 08:18:22 显示全部楼层
实验了一下UP的工程,热点的生成似乎不能动态变化,增加在工程运行的时候改变countPoint就会报错
回复 支持 反对

使用道具 举报

5熟悉之中
744/1000
排名
3900
昨日变化

9

主题

121

帖子

744

积分

Rank: 5Rank: 5

UID
232340
好友
0
蛮牛币
208
威望
0
注册时间
2017-7-15
在线时间
230 小时
最后登录
2019-5-25
2018-7-10 08:19:19 显示全部楼层
谢谢分享
回复

使用道具 举报

6蛮牛粉丝
1360/1500
排名
1828
昨日变化

0

主题

258

帖子

1360

积分

Rank: 6Rank: 6Rank: 6

UID
83972
好友
2
蛮牛币
838
威望
0
注册时间
2015-3-24
在线时间
374 小时
最后登录
2019-5-24
2018-7-10 08:24:29 显示全部楼层
钱钱钱钱钱钱钱钱钱钱钱钱钱钱钱
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则