using System.Collections.Generic; using System.Linq; using UnityEngine; [RequireComponent(typeof(Renderer))] public class Heatmap : MonoBehaviour { public Texture2D heatTex; public Shader heatShader; Renderer meshRenderer; Material material; int pointCount; ComputeBuffer pointBuffer; Renderer MeshRenderer { get { if (meshRenderer == null) meshRenderer = GetComponent(); return meshRenderer; } } void Start() { GenerateMeterial(); } private void OnDestroy() { if (pointBuffer != null) { pointBuffer.Release(); pointBuffer = null; } } /// /// 重新生成材质 /// private void GenerateMeterial() { if (this.material != null) Destroy(this.material); this.material = new Material(heatShader); this.material.SetTexture("_HeatTex", heatTex); this.MeshRenderer.sharedMaterial = material; } /// /// 将参数信息提交到 Shader Program /// private void CommitToShaderProgram() { material.SetInt("_Points_Length", pointCount); material.SetBuffer("_PointBuffer", pointBuffer); } /// /// 根据指定的热点,设置热力图 /// /// public void SetHeatPoints(List points) { if (pointBuffer != null) pointBuffer.Release(); this.pointCount = points.Count; this.pointBuffer = new ComputeBuffer(points.Count(), 20); this.pointBuffer.SetData(points); CommitToShaderProgram(); } } [System.Serializable] public struct HeatPoint { /// /// 世界坐标系位置 /// public Vector3 point; /// /// 半径 /// public float radius; /// /// 强度 /// public float intensity; }