效果图

柱状温度图,和上一篇温度图的区别就只是在展示效果。

柱状物体会随机分布在温度点周围的一定范围内,越靠近温度点柱子越高,柱子的颜色根据高度有变化。

一、实现原理

简单来说就是生成很多柱子,更具温度点的位置进行分布。

但是如果直接实例化很多柱子,电脑肯定扛不住的,因为一个点可能有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 热力图(二)相关推荐

  1. [Unity 3D] 重力感应与罗盘(二)

    让世界旋转起来: 游戏世界的主摄像机就是我们在游戏里的"眼睛",为了让"眼睛"能够与手持 iPad 的我们保持协调,跟随着我们自己转身而转动,好像我们自己就站在 ...

  2. 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 ...

  3. 再议Unity 3D

    一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...

  4. [Unity 3D] Unity 3D 性能优化 (一)

    出处:http://blog.csdn.net/lijing_hi/article/details/11657887 听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我 ...

  5. Unity 3D游戏编程自学#3——Unity 3D初步

    1.开始 在创建的项目文件夹中,各个子文件夹的作用: Assets:保存游戏所需资源. Library:保存当前项目运行所需要的库. ProjectSettings:保存项目设置信息. Temp:保存 ...

  6. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  7. 【Unity 3D 从入门到实战】Unity 3D 组件总结

    目录 一,前言 二,常用组件 1,Transform 组件 2,Mesh Filter 组件 3,Box Collider 组件 4,Rigidbody 组件 5,脚本组件 三,总结 一,前言 组件是 ...

  8. 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍

    随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...

  9. Unity 3D游戏编程自学#7——NGUI入门

    1. NGUI简介 NGUI: Next-Gen UI kit(以下简称NGUI)是一个第三方的Unity开发包(我原来以为是Unity自带的),下载下来后是一个unitypackage的文件,导入后 ...

最新文章

  1. 什么是标记符控制的分水岭算法
  2. 计算机vb实验报告,VB综合实验报告格式
  3. java多线程-阻塞队列BlockingQueue
  4. android设备报警推送,Firebase推送通知未送达所有android设备
  5. 黑马冠军快手在国际回声消除大赛中战绩颇丰
  6. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
  7. IIS执行ASP程序不能调用数据库出现500错误的解决方法
  8. mysql数据库实例
  9. 2021江西高考成绩6月23日几点查询,2021年江西高考成绩查询时间:6月23日
  10. 【控制】《最优控制理论与系统》-胡寿松老师-第3章-极小值原理及其应用
  11. Markdown win10上显示awesomium
  12. 铁塔基站三相有功电能无线计量仪表外置互感器-安科瑞 顾月
  13. 九月热点:EasyDL智能边缘控制台、EdgeBoard路内停车分析盒全新发布
  14. 谷歌浏览器开发者模式
  15. 802.11ac协议白皮书阅读笔记
  16. 考研用什么蓝牙降噪耳机好?适合学生党的降噪耳机推荐
  17. Apache Storm 官方文档 —— Trident API 概述
  18. iTop-4412 裸机程序(十三)- 串口初始化
  19. C语言:围圈报号排序问题
  20. kinect V2 驱动安装说明

热门文章

  1. 华为机考攻略(python)--字符串操作【9题】(第六题leetcode1839所有元音按顺序排布的最长子字符串)
  2. 基因数据处理32之Avocado运行记录(人造数据集)
  3. 华为鸿蒙系统手机加麒麟1020,华为下半年再放大招,鸿蒙系统正式亮相,搭载麒麟1020处理器...
  4. vue使用element-ui或者element-plus固定 el-header 和 el-aside
  5. 为什么TransFormer中的FFN有两层,先升维再降维?
  6. 搭建Keepalived+Nginx高可用负载均衡服务器
  7. 自己建设网站需要做哪些准备
  8. php实现摇一摇点名程序
  9. 自动化测试遇到手机号验证码怎么办?
  10. 一、Git下载安装(Windows下)