-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path7-C# Script__Unity__InstancedVisualization-NewVisualization.cs.txt
More file actions
70 lines (55 loc) · 2.19 KB
/
7-C# Script__Unity__InstancedVisualization-NewVisualization.cs.txt
File metadata and controls
70 lines (55 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using UnityEngine;
using UnityEngine.Rendering;
using static System.Runtime.InteropServices.Marshal;
// [ExecuteInEditMode]
public class #SCRIPTNAME# : MonoBehaviour
{
[SerializeField] private ComputeShader initializeShader;
[SerializeField] private Mesh instancedMesh;
[SerializeField] private int instanceCount;
private Bounds bounds;
private Material instancedMaterial;
private ComputeBuffer instancedBuffer;
private ComputeBuffer argsBuffer;
private uint[] args = new uint[5] { 0, 0, 0, 0, 0 };
private static readonly int Instances = Shader.PropertyToID("_Instances");
private static readonly int InstancedBuffer = Shader.PropertyToID("_InstanceBuffer");
private struct InstanceData
{
public Vector3 position;
}
private void OnEnable()
{
if (!instancedMaterial) instancedMaterial = CoreUtils.CreateEngineMaterial("Hidden/#SCRIPTNAME#");
bounds = new Bounds(transform.position, Vector3.one * 100f);
// instance setting
instancedBuffer = new ComputeBuffer(instanceCount, SizeOf(typeof(InstanceData)));
initializeShader.SetBuffer(0, Instances, instancedBuffer);
initializeShader.Dispatch(0, Mathf.CeilToInt(instanceCount / 256.0f), 1, 1);
// args setting
argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments);
args[0] = (uint)instancedMesh.GetIndexCount(0);
args[1] = (uint)instanceCount;
args[2] = (uint)instancedMesh.GetIndexStart(0);
args[3] = (uint)instancedMesh.GetBaseVertex(0);
argsBuffer.SetData(args);
// final shader setting
instancedMaterial.SetBuffer(InstancedBuffer, instancedBuffer);
}
private void Update()
{
if (!Application.isPlaying)
{
OnDisable();
OnEnable();
}
if(instancedMaterial)
Graphics.DrawMeshInstancedIndirect(instancedMesh, 0, instancedMaterial, bounds, argsBuffer);
}
private void OnDisable()
{
argsBuffer?.Release();
instancedBuffer?.Release();
if(instancedMaterial) CoreUtils.Destroy(instancedMaterial);
}
}