Unity 3D 热力图(二)
效果图
柱状温度图,和上一篇温度图的区别就只是在展示效果。
柱状物体会随机分布在温度点周围的一定范围内,越靠近温度点柱子越高,柱子的颜色根据高度有变化。
一、实现原理
简单来说就是生成很多柱子,更具温度点的位置进行分布。
但是如果直接实例化很多柱子,电脑肯定扛不住的,因为一个点可能有60个柱子,100个点就是6000个柱子。
我使用的方法是使用CommandBuffer直接绘制柱子。CommandBuffer最多绘制1023个柱子,所以多个柱子需要多个CommandBuffer。
public void CommandBufferForDrawMeshInstanced(){SetPos();RemoveCommandBuffer();if (m_buff != null){for (int i = 0; i < m_buff.Length; i++)m_buff.Release();}int rendercount = m_atrix4x4s.Length / 1023 + (m_atrix4x4s.Length % 1023 == 0 ? 0 : 1);m_buff = new CommandBuffer[rendercount];for (int i = 0; i < m_buff.Length; i++){m_buff[i] = new CommandBuffer();m_buff[i].name = "tempratureObject" + i;}for (int i = 0; i < rendercount; i++){int count = i < rendercount - 1 ? 1023 : (m_atrix4x4s.Length - i * 1023);Matrix4x4[] senddata = new Matrix4x4[count];Array.Copy(m_atrix4x4s, i * 1023, senddata, 0, count);m_buff[i].DrawMeshInstanced(objectMesh, 0, _mat, 0, senddata, senddata.Length);Camera.main.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_buff[i]);}}
我这里插入的只是绘制部分的代码。
矩阵是柱子的坐标旋转缩放矩阵
Matrix4x4.TRS(objpos , Quaternion.Euler(objectRot) , scale);
这样就能控制每个柱子的高度和位置了。
柱子的颜色就是用Shader控制就好了,这部分Shader就比较简单了,颜色插值的算法使用的是上一篇文章一样的算法。
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "EasyV/Effect/thermograph3dobject"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color1("_Color1" , Color) =(1,1,1,1)_Color2("_Color2" , Color) =(1,1,1,1)_Color3("_Color3" , Color) =(1,1,1,1)_Color4("_Color4" , Color) =(1,1,1,1)_Alpha("Alpha" , Range(0,1)) = 0.5}SubShader{Tags { "RenderType"="Transparent" "Queue" ="Transparent"}Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancing#include "UnityCG.cginc"#include "thermpgraph.hlsl"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float temp : TEXCOORD1;UNITY_VERTEX_INPUT_INSTANCE_ID};sampler2D _MainTex;float4 _MainTex_ST;float _Alpha ;vector tempData[500];float tempcount;float perTempHeight;float maxRefrence;float baseHeight;v2f vert (appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v,o);float height = (mul(unity_ObjectToWorld , v.vertex)).y - baseHeight;o.temp = height / perTempHeight;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{UNITY_SETUP_INSTANCE_ID(i);fixed4 col = tex2D(_MainTex, i.uv);fixed4 color = Temp2Color(i.temp , col ,_Alpha);return color;}ENDCG}}
}
这里注意了,Shader必须要支持Instance。而且材质球要开启Instance。
_mat.enableInstancing = true;
二、限制问题
由于使用了CommandBuffer,所以这种方式只能在默认渲染管线中使用,但是在URP或者HDRP中应该也能实现类似的。
Unity 3D 热力图(二)相关推荐
- [Unity 3D] 重力感应与罗盘(二)
让世界旋转起来: 游戏世界的主摄像机就是我们在游戏里的"眼睛",为了让"眼睛"能够与手持 iPad 的我们保持协调,跟随着我们自己转身而转动,好像我们自己就站在 ...
- Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...
- 再议Unity 3D
一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...
- [Unity 3D] Unity 3D 性能优化 (一)
出处:http://blog.csdn.net/lijing_hi/article/details/11657887 听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我 ...
- Unity 3D游戏编程自学#3——Unity 3D初步
1.开始 在创建的项目文件夹中,各个子文件夹的作用: Assets:保存游戏所需资源. Library:保存当前项目运行所需要的库. ProjectSettings:保存项目设置信息. Temp:保存 ...
- Unity 3D模型展示之webGL平台展现
在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...
- 【Unity 3D 从入门到实战】Unity 3D 组件总结
目录 一,前言 二,常用组件 1,Transform 组件 2,Mesh Filter 组件 3,Box Collider 组件 4,Rigidbody 组件 5,脚本组件 三,总结 一,前言 组件是 ...
- 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍
随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...
- Unity 3D游戏编程自学#7——NGUI入门
1. NGUI简介 NGUI: Next-Gen UI kit(以下简称NGUI)是一个第三方的Unity开发包(我原来以为是Unity自带的),下载下来后是一个unitypackage的文件,导入后 ...
最新文章
- 什么是标记符控制的分水岭算法
- 计算机vb实验报告,VB综合实验报告格式
- java多线程-阻塞队列BlockingQueue
- android设备报警推送,Firebase推送通知未送达所有android设备
- 黑马冠军快手在国际回声消除大赛中战绩颇丰
- 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
- IIS执行ASP程序不能调用数据库出现500错误的解决方法
- mysql数据库实例
- 2021江西高考成绩6月23日几点查询,2021年江西高考成绩查询时间:6月23日
- 【控制】《最优控制理论与系统》-胡寿松老师-第3章-极小值原理及其应用
- Markdown win10上显示awesomium
- 铁塔基站三相有功电能无线计量仪表外置互感器-安科瑞 顾月
- 九月热点:EasyDL智能边缘控制台、EdgeBoard路内停车分析盒全新发布
- 谷歌浏览器开发者模式
- 802.11ac协议白皮书阅读笔记
- 考研用什么蓝牙降噪耳机好?适合学生党的降噪耳机推荐
- Apache Storm 官方文档 —— Trident API 概述
- iTop-4412 裸机程序(十三)- 串口初始化
- C语言:围圈报号排序问题
- kinect V2 驱动安装说明
热门文章
- 华为机考攻略(python)--字符串操作【9题】(第六题leetcode1839所有元音按顺序排布的最长子字符串)
- 基因数据处理32之Avocado运行记录(人造数据集)
- 华为鸿蒙系统手机加麒麟1020,华为下半年再放大招,鸿蒙系统正式亮相,搭载麒麟1020处理器...
- vue使用element-ui或者element-plus固定 el-header 和 el-aside
- 为什么TransFormer中的FFN有两层,先升维再降维?
- 搭建Keepalived+Nginx高可用负载均衡服务器
- 自己建设网站需要做哪些准备
- php实现摇一摇点名程序
- 自动化测试遇到手机号验证码怎么办?
- 一、Git下载安装(Windows下)