public ComputeSession(ComputeShader meshSampleComputeShader, ComputeShader tesselationComputeShader, int size, float padding, bool sampleUVs, Matrix4x4 transform) { MeshSampleComputeShader = Instantiate(meshSampleComputeShader); TessellationComputeShader = Instantiate(tesselationComputeShader); GetTextureWholeKernel = MeshSampleComputeShader.FindKernel(GetTextureWholeKernelName); ComputeBoundsKernel = MeshSampleComputeShader.FindKernel(ComputeBoundsKernelName); TessellateKernel = TessellationComputeShader.FindKernel(TessellateKernelName); PreprocessMeshKernel = TessellationComputeShader.FindKernel(PreprocessMeshKernelName); m_sampleUVs = sampleUVs; m_size = size; m_padding = padding; m_transform = transform; m_samples = new float[Dimensions]; m_packedUVs = new float[Dimensions]; BoundsBuffer = new ComputeBuffer(6, sizeof(int)); MeshSampleComputeShader.SetBuffer(ComputeBoundsKernel, Properties.MeshBounds_RWStructuredBuffer, BoundsBuffer); SamplesBuffer = new ComputeBuffer(Dimensions, sizeof(float)); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.Samples_RWStructuredBuffer, SamplesBuffer); PackedUVsBuffer = new ComputeBuffer(Dimensions, sizeof(float)); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.PackedUVs_RWStructuredBuffer, PackedUVsBuffer); MeshSampleComputeShader.SetInt(Properties.Size_Int, m_size); MeshSampleComputeShader.SetFloat(Properties.Padding_Float, m_padding); MeshSampleComputeShader.SetMatrix(Properties.ModelTransformMatrix_Matrix, m_transform); }
public void Dispatch(Mesh mesh, out float[] samples, out float[] packedUVs, out Vector3 minBounds, out Vector3 maxBounds) { m_triangles = mesh.triangles; m_vertices = mesh.vertices; m_normals = mesh.normals; m_uvs = mesh.uv; InputTrianglesBuffer = new ComputeBuffer(m_triangles.Length, sizeof(int), ComputeBufferType.Structured); InputVerticesBuffer = new ComputeBuffer(m_vertices.Length, sizeof(float) * 3, ComputeBufferType.Structured); InputNormalsBuffer = new ComputeBuffer(m_normals.Length, sizeof(float) * 3, ComputeBufferType.Structured); InputTrianglesBuffer.SetData(m_triangles); InputNormalsBuffer.SetData(m_normals); InputVerticesBuffer.SetData(m_vertices); MeshSampleComputeShader.SetBuffer(ComputeBoundsKernel, Properties.InputTriangles_StructuredBuffer, InputTrianglesBuffer); MeshSampleComputeShader.SetBuffer(ComputeBoundsKernel, Properties.InputVertices_StructuredBuffer, InputVerticesBuffer); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.InputTriangles_StructuredBuffer, InputTrianglesBuffer); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.InputNormals_StructuredBuffer, InputNormalsBuffer); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.InputVertices_StructuredBuffer, InputVerticesBuffer); bool hasUVs = !m_uvs.IsNullOrEmpty(); if (m_sampleUVs && hasUVs) { MeshSampleComputeShader.EnableKeyword(WriteUVsKeyword); InputUVsBuffer = new ComputeBuffer(m_uvs.Length, sizeof(float) * 2, ComputeBufferType.Structured); InputUVsBuffer.SetData(m_uvs); MeshSampleComputeShader.SetBuffer(GetTextureWholeKernel, Properties.InputUVs_StructuredBuffer, InputUVsBuffer); } else { MeshSampleComputeShader.DisableKeyword(WriteUVsKeyword); } MeshSampleComputeShader.SetInt(Properties.TriangleCount_Int, m_triangles.Length); MeshSampleComputeShader.SetInt(Properties.VertexCount_Int, m_vertices.Length); RunBoundsPhase(mesh, out minBounds, out maxBounds); RunSamplePhase(hasUVs, out samples, out packedUVs, minBounds, maxBounds); }