コード例 #1
0
        public RenderingShader(ComputeShader shader, Shader materialShader, int BufferSize, bool UseCloseBuffer = false, Mesh mesh = null, Material mat = null)
        {
            _shader = shader;

            if (UseCloseBuffer)
            {
                _renderBufferNear.SafeRelease();
                _renderBufferNear = new ComputeBuffer(Mathf.CeilToInt(BufferSize / 4f), sizeof(float) * 4, ComputeBufferType.Append);

                _meshMaterial = mat;
                _meshMaterial.SetBuffer("_Buffer", _renderBufferNear);

                var subMeshIndex = 0;
                subMeshIndex = Mathf.Clamp(subMeshIndex, 0, mesh.subMeshCount - 1);
                _indirectBufferNear.SetData(new uint[5] {
                    mesh.GetIndexCount(subMeshIndex), 0, mesh.GetIndexStart(subMeshIndex), mesh.GetBaseVertex(subMeshIndex), 0
                });
            }

            _renderBufferFar.SafeRelease();
            _renderBufferFar = new ComputeBuffer(BufferSize, sizeof(float) * 4, ComputeBufferType.Append);

            _material = new Material(materialShader);
            _material.SetBuffer(ShaderID.pointBuffer, _renderBufferFar);

            _indirectBufferFar.SetData(new uint[] { 0, 1, 0, 0 });
        }
コード例 #2
0
        private void GenerateBuffers(int maxVertices, int maxIndices)
        {
            _maxVertices = maxVertices;
            _maxIndices  = maxIndices;

            if (_vertices != null)
            {
                Debug.LogWarning("--------------------- cleared buffers ---------------------");
                _vertices.SafeRelease();
                _indices.SafeRelease();
                _texcoords.SafeRelease();
            }

            _vertices  = new ComputeBuffer(maxVertices, sizeof(float) * 3, ComputeBufferType.Default);
            _indices   = new ComputeBuffer(maxIndices, sizeof(int), ComputeBufferType.Default);
            _texcoords = new ComputeBuffer(maxVertices, sizeof(float) * 2, ComputeBufferType.Default);

            _vertices.SetCounterValue(0);
            _indices.SetCounterValue(0);
            _texcoords.SetCounterValue(0);

            _generatorKernel.SetBuffer(ComputeShaderID.surfaceVertices, _vertices);
            _generatorKernel.SetBuffer(ComputeShaderID.surfaceIndices, _indices);
            _generatorKernel.SetBuffer(ComputeShaderID.surfaceUVs, _texcoords);
        }
コード例 #3
0
        public void Dispose()
        {
            _inputBuffer.SafeRelease();
            _indirectInputBuffer.SafeRelease();

            GameObject.Destroy(_shader);
        }
コード例 #4
0
        public void Dispose()
        {
            _renderBufferNear.SafeRelease();
            _indirectBufferNear.SafeRelease();

            _renderBufferFar.SafeRelease();
            _indirectBufferFar.SafeRelease();

            GameObject.Destroy(_material);
        }
コード例 #5
0
        private void OnDestroy()
        {
            foreach (Grass grass in _drawGrass)
            {
                SafeRelease(grass);
            }

            _inderectBuffer.SafeRelease();
            _megaBuffer.SafeRelease();
        }
コード例 #6
0
        private void OnDestroy()
        {
            foreach (Trees tree in _drawTree)
            {
                SafeRelease(tree);
            }

            _inderectBuffer.SafeRelease();
            _megaBuffer.SafeRelease();

            _closeMegaBuffer.SafeRelease();
            _closeInderectBuffer.SafeRelease();
        }
コード例 #7
0
        // --- GrassComponent ---
        private void InitializeMaterial()
        {
            string _QuadKernelName = "FindQuad";

            _treeMaterial = new Material(TreeShader);

            // ********************** Grass material **********************
            _treeMaterial.SetBuffer(ShaderID.treeBuffer, _megaBuffer);
            TestMat.SetBuffer("_Buffer", _closeMegaBuffer);

            _treeMaterial.SetTexture(ShaderID.treeTexture, _treeTextures);
            _treeMaterial.SetTexture(ShaderID.perlinNoise, PerlinNoise);
            _treeMaterial.SetTexture(ShaderID.colorVariance, PerlinNoise);

            _treeMaterial.SetVectorArray(ShaderID.minMaxWidthHeight, _minMaxWidthHeight);
            List <Vector4> quads            = new List <Vector4>();
            ComputeBuffer  smallestQuad     = new ComputeBuffer(1, sizeof(float) * 4, ComputeBufferType.Append);
            ComputeKernel  findSmallestQuad = new ComputeKernel(_QuadKernelName, ComputeShader);

            foreach (TerrainTextures terrain in TreeTextures)
            {
                var front = GetBillboardTexture(Sides.Front, terrain.FeatureTexture);
                var side  = GetBillboardTexture(Sides.Side, terrain.FeatureTexture);
                var top   = GetBillboardTexture(Sides.Top, terrain.FeatureTexture);


                var frontXY = CalcSide(front, findSmallestQuad, smallestQuad);
                var sideXY  = CalcSide(side, findSmallestQuad, smallestQuad);
                var topXY   = CalcSide(top, findSmallestQuad, smallestQuad);

                quads.Add(frontXY / front.width);
                quads.Add(sideXY / side.width);
                quads.Add(topXY / top.width);
            }

            smallestQuad.SafeRelease();
            _treeMaterial.SetVectorArray(ShaderID.quads, quads.ToArray());
            //Debug.LogFormat("Generated Mesh");
        }