【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2377

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 6259|回复: 271

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

  [复制链接]  [移动端链接]
排名
137
昨日变化

116

主题

551

帖子

6753

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
106
蛮牛币
4685
威望
0
注册时间
2013-9-10
在线时间
1441 小时
最后登录
2018-12-14

专栏作家社区QQ达人活力之星游戏蛮牛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日久生情
3847/5000
排名
160
昨日变化

11

主题

502

帖子

3847

积分

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

UID
52346
好友
0
蛮牛币
5341
威望
0
注册时间
2014-10-31
在线时间
1002 小时
最后登录
2018-12-19
发表于 2018-7-9 18:54:54 | 显示全部楼层
感谢分享  感谢分享

回复 支持 反对

使用道具 举报

7日久生情
1621/5000
排名
1814
昨日变化
7

0

主题

460

帖子

1621

积分

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

UID
135463
好友
0
蛮牛币
37
威望
0
注册时间
2016-1-23
在线时间
447 小时
最后登录
2018-12-19
发表于 2018-7-9 19:07:35 | 显示全部楼层
u9ipoiuouiouioiuoiu

回复 支持 反对

使用道具 举报

4四处流浪
439/500
排名
8041
昨日变化
4

0

主题

226

帖子

439

积分

Rank: 4

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

回复

使用道具 举报

7日久生情
4191/5000
排名
168
昨日变化

18

主题

317

帖子

4191

积分

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

UID
67323
好友
1
蛮牛币
3370
威望
0
注册时间
2015-1-10
在线时间
1648 小时
最后登录
2018-12-18
发表于 2018-7-9 20:37:47 | 显示全部楼层
6666  最近也想搞 一堆这个东西

回复 支持 反对

使用道具 举报

排名
16197
昨日变化
5

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熟悉之中
571/1000
排名
4832
昨日变化
20

0

主题

160

帖子

571

积分

Rank: 5Rank: 5

UID
114090
好友
0
蛮牛币
215
威望
0
注册时间
2015-7-18
在线时间
121 小时
最后登录
2018-12-18
发表于 2018-7-9 22:09:38 | 显示全部楼层
666666666666666666

回复 支持 反对

使用道具 举报

7日久生情
3995/5000
排名
139
昨日变化

1

主题

520

帖子

3995

积分

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

UID
11004
好友
0
蛮牛币
4498
威望
0
注册时间
2013-12-24
在线时间
1200 小时
最后登录
2018-12-18

VIP

发表于 2018-7-9 22:54:51 | 显示全部楼层
这么好的东西。
[发帖际遇]: hzwlm 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
484/500
排名
5357
昨日变化
28

0

主题

60

帖子

484

积分

Rank: 4

UID
272612
好友
1
蛮牛币
332
威望
0
注册时间
2018-3-15
在线时间
166 小时
最后登录
2018-12-18
发表于 2018-7-9 23:07:42 | 显示全部楼层
感谢分享
[发帖际遇]: zisen 在网吧通宵,花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
3957/5000
排名
94
昨日变化

1

主题

396

帖子

3957

积分

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

UID
28000
好友
0
蛮牛币
4081
威望
0
注册时间
2014-6-4
在线时间
1038 小时
最后登录
2018-12-18
发表于 2018-7-9 23:46:10 | 显示全部楼层
谢谢~~~~~~~~~~~~
[发帖际遇]: vtbox 被钱袋砸中进医院,看病花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1027/1500
排名
1807
昨日变化
6

0

主题

64

帖子

1027

积分

Rank: 6Rank: 6Rank: 6

UID
3463
好友
2
蛮牛币
1757
威望
0
注册时间
2013-9-8
在线时间
247 小时
最后登录
2018-12-19
发表于 2018-7-10 05:22:55 | 显示全部楼层
謝謝分享,研究一下。

回复 支持 反对

使用道具 举报

4四处流浪
336/500
排名
6259
昨日变化
44

0

主题

43

帖子

336

积分

Rank: 4

UID
111073
好友
0
蛮牛币
559
威望
0
注册时间
2015-6-29
在线时间
81 小时
最后登录
2018-12-19
发表于 2018-7-10 07:58:31 | 显示全部楼层
感谢分享  感谢分享
[发帖际遇]: 一个袋子砸在了 weiyuliang 头上,weiyuliang 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
336/500
排名
6259
昨日变化
44

0

主题

43

帖子

336

积分

Rank: 4

UID
111073
好友
0
蛮牛币
559
威望
0
注册时间
2015-6-29
在线时间
81 小时
最后登录
2018-12-19
发表于 2018-7-10 08:18:22 | 显示全部楼层
实验了一下UP的工程,热点的生成似乎不能动态变化,增加在工程运行的时候改变countPoint就会报错

回复 支持 反对

使用道具 举报

5熟悉之中
551/1000
排名
4802
昨日变化
3

6

主题

94

帖子

551

积分

Rank: 5Rank: 5

UID
232340
好友
0
蛮牛币
465
威望
0
注册时间
2017-7-15
在线时间
159 小时
最后登录
2018-12-17
发表于 2018-7-10 08:19:19 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1182/1500
排名
2172
昨日变化
10

0

主题

253

帖子

1182

积分

Rank: 6Rank: 6Rank: 6

UID
83972
好友
2
蛮牛币
450
威望
0
注册时间
2015-3-24
在线时间
311 小时
最后登录
2018-12-18
发表于 2018-7-10 08:24:29 | 显示全部楼层
钱钱钱钱钱钱钱钱钱钱钱钱钱钱钱

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表