예제 #1
0
            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);
            }
예제 #2
0
            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);
            }