游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2258

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

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

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

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

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

111

主题

541

帖子

6479

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
99
蛮牛币
3720
威望
0
注册时间
2013-9-10
在线时间
1364 小时
最后登录
2018-7-17

专栏作家社区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日久生情
3495/5000
排名
184
昨日变化

11

主题

455

帖子

3495

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
890/1000
排名
3049
昨日变化
15

0

主题

232

帖子

890

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

4四处流浪
305/500
排名
9699
昨日变化
129

0

主题

159

帖子

305

积分

Rank: 4

UID
281167
好友
0
蛮牛币
537
威望
0
注册时间
2018-5-14
在线时间
44 小时
最后登录
2018-7-16

一贫如洗

发表于 2018-7-9 19:30:27 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
4080/5000
排名
148
昨日变化
1

18

主题

310

帖子

4080

积分

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

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

回复 支持 反对

使用道具 举报

排名
15715
昨日变化
3

0

主题

8

帖子

84

积分

Rank: 2Rank: 2

UID
275619
好友
0
蛮牛币
19
威望
0
注册时间
2018-4-4
在线时间
37 小时
最后登录
2018-7-12
发表于 2018-7-9 20:42:09 | 显示全部楼层
666666

回复

使用道具 举报

3偶尔光临
239/300
排名
10986
昨日变化
146

0

主题

120

帖子

239

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
3678/5000
排名
160
昨日变化

1

主题

496

帖子

3678

积分

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

UID
11004
好友
0
蛮牛币
4366
威望
0
注册时间
2013-12-24
在线时间
1099 小时
最后登录
2018-7-15

VIP

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

回复

使用道具 举报

3偶尔光临
250/300
排名
8862
昨日变化
4

0

主题

52

帖子

250

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

7日久生情
3602/5000
排名
102
昨日变化

1

主题

351

帖子

3602

积分

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

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

回复

使用道具 举报

5熟悉之中
628/1000
排名
3108
昨日变化
10

0

主题

44

帖子

628

积分

Rank: 5Rank: 5

UID
3463
好友
1
蛮牛币
1052
威望
0
注册时间
2013-9-8
在线时间
158 小时
最后登录
2018-7-17
发表于 7 天前 | 显示全部楼层
謝謝分享,研究一下。

回复 支持 反对

使用道具 举报

3偶尔光临
231/300
排名
8166
昨日变化
75

0

主题

39

帖子

231

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

3偶尔光临
231/300
排名
8166
昨日变化
75

0

主题

39

帖子

231

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

4四处流浪
317/500
排名
7298
昨日变化
3

5

主题

66

帖子

317

积分

Rank: 4

UID
232340
好友
0
蛮牛币
370
威望
0
注册时间
2017-7-15
在线时间
90 小时
最后登录
2018-7-12
发表于 7 天前 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
918/1000
排名
2979
昨日变化
13

0

主题

236

帖子

918

积分

Rank: 5Rank: 5

UID
83972
好友
1
蛮牛币
212
威望
0
注册时间
2015-3-24
在线时间
242 小时
最后登录
2018-7-16
发表于 7 天前 | 显示全部楼层
钱钱钱钱钱钱钱钱钱钱钱钱钱钱钱

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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