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 }); }
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); }
public void Dispose() { _inputBuffer.SafeRelease(); _indirectInputBuffer.SafeRelease(); GameObject.Destroy(_shader); }
public void Dispose() { _renderBufferNear.SafeRelease(); _indirectBufferNear.SafeRelease(); _renderBufferFar.SafeRelease(); _indirectBufferFar.SafeRelease(); GameObject.Destroy(_material); }
private void OnDestroy() { foreach (Grass grass in _drawGrass) { SafeRelease(grass); } _inderectBuffer.SafeRelease(); _megaBuffer.SafeRelease(); }
private void OnDestroy() { foreach (Trees tree in _drawTree) { SafeRelease(tree); } _inderectBuffer.SafeRelease(); _megaBuffer.SafeRelease(); _closeMegaBuffer.SafeRelease(); _closeInderectBuffer.SafeRelease(); }
// --- 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"); }