using UnityEngine; public class GenerateVectorData : MonoBehaviour { private SkinnedMeshRenderer m_mesh; private Mesh skinnedMeshCache; private Vector3[] vertexFrameCache1; private Vector3[] vertexFrameCache2; private Vector3[] vertexFrameCache3; private ComputeBuffer vertexBuffer1; private ComputeBuffer vertexBuffer2; private ComputeBuffer vertexBuffer3; void Start() { m_mesh = GetComponent(); skinnedMeshCache = new Mesh(); //initializing variables and buffers m_mesh.BakeMesh(skinnedMeshCache); vertexFrameCache1 = m_mesh.sharedMesh.vertices; vertexFrameCache2 = m_mesh.sharedMesh.vertices; vertexFrameCache3 = m_mesh.sharedMesh.vertices; //We use Buffers because we can't send the vertices as is, sending vector arrays to shader needs to be done as Vector4[], and Mesh.Vertices is a Vector3[]. Buffers allow us to bypass this issue vertexBuffer1 = new ComputeBuffer(m_mesh.sharedMesh.vertices.Length, 12); //Buffer needs to be the same size as the vertices length and have 3 * 4 (bytes) as size vertexBuffer2 = new ComputeBuffer(m_mesh.sharedMesh.vertices.Length, 12); vertexBuffer3 = new ComputeBuffer(m_mesh.sharedMesh.vertices.Length, 12); } void Update() { //Copying vertex data: this is done from oldest to newest value to keep 4 all frames cached vertexFrameCache3 = vertexFrameCache2; vertexFrameCache2 = vertexFrameCache1; vertexFrameCache1 = skinnedMeshCache.vertices; m_mesh.BakeMesh(skinnedMeshCache); //We can't access Skinned mesh data directly, so we need to store the information of the mesh //Sending vertex information to buffers vertexBuffer3.SetData(vertexFrameCache3); vertexBuffer2.SetData(vertexFrameCache2); vertexBuffer1.SetData(vertexFrameCache1); //This could be done per material instead of a global variable, it's just for proof of concept Shader.SetGlobalBuffer("_VertexBuffer3", vertexBuffer3); Shader.SetGlobalBuffer("_VertexBuffer2", vertexBuffer2); Shader.SetGlobalBuffer("_VertexBuffer1", vertexBuffer1); } void OnDestroy() { //Make sure to release to avoid GC vertexBuffer1.Release(); vertexBuffer2.Release(); vertexBuffer3.Release(); } }