示例#1
0
    // * Rename to suggest this is a per-frame update, break out the initialization logic
    // * APPLICATION BOTTLENECK: focus optimization efforts here!
    // Since this is for visuals, could call on a fixed interval, e.g. 1/5 second
    public void InitializeRenderBuffers()
    {
        // * For testing
        var cursorCoords = theCursorCzar.GetScaledCursorCoords(360f, -720f);

        // Initialize world tree line data
        var worldTreeLines = new WorldTreeLineData[worldTreeBufferCount];

        worldTreeLineDataCBuffer?.Release();
        worldTreeLineDataCBuffer = new ComputeBuffer(worldTreeBufferCount, sizeof(float) * 7);


        // Create creature lines
        for (int line = 0; line < worldTreeNumCreatureLines; line++)
        {
            for (int i = 0; i < worldTreeNumPointsPerLine; i++)
            {
                CreateCreatureLine(line, i, cursorCoords, worldTreeLines);
            }
        }

        // Create species lines (on top)
        for (int line = 0; line < worldTreeNumSpeciesLines; line++)
        {
            for (int i = 0; i < worldTreeNumPointsPerLine; i++)
            {
                CreateSpeciesLine(line, i, cursorCoords, worldTreeLines);
            }
        }


        worldTreeLineDataCBuffer.SetData(worldTreeLines);
    }
示例#2
0
 private void OnDisable()
 {
     _sphereBuffer?.Release();
     _meshObjectBuffer?.Release();
     _vertexBuffer?.Release();
     _indexBuffer?.Release();
 }
示例#3
0
    public void ClearBuffers()
    {
        /*
         * if(animalParticlesNearestCritters1 != null) {
         * animalParticlesNearestCritters1.Release();
         * animalParticlesNearestCritters32.Release();
         * animalParticlesNearestCritters1024.Release();
         * } */
        animalParticlesCBuffer?.Release();
        animalParticlesCBufferSwap?.Release();
        closestAnimalParticlesDataCBuffer?.Release();
        animalParticlesEatAmountsCBuffer?.Release();
        animalParticlesMeasure32?.Release();
        animalParticlesMeasure1?.Release();
        zooplanktonRepresentativeGenomeCBuffer?.Release();

        if (critterNearestZooplankton32 != null)
        {
            critterNearestZooplankton32.Release();
        }

        closestZooplanktonDistancesCBuffer?.Release();
        closestAnimalParticlesDataCBuffer?.Release();
        cursorDistances1024?.Release();
        cursorClosestParticleDataCBuffer?.Release();
    }
    private void Update()
    {
        positionBuffer?.Release();
        positionBuffer = new ComputeBuffer(count * count, 4 * 16);

        computeShader.SetInt(ResolutionID, count);
        computeShader.SetFloat(TimeID, Time.time);
        computeShader.SetBuffer(0, PositionID, positionBuffer);

        //resolution : 128
        //16,384 개의 스레드가 돌아야 함
        //커널함수 하나가 8 * 8 = 64 개의 스레드를 갖고 있으니
        //16,384 / 64 = 256 개의 그룹을 돌려야 함
        //루트256 = 16 이므로 각 그룹은 16이어야 함
        //16은 즉 resolution / 8 과 같으므로
        //groups = resoltion / 8 임
        int groups = Mathf.CeilToInt(count / 8f);

        computeShader.Dispatch(0, groups, groups, 1);

        material.SetBuffer(PositionID, positionBuffer);
        Graphics.DrawMeshInstancedProcedural(
            mesh, 0, material, new Bounds(Vector3.zero, Vector3.one), count * count
            );
    }
 private void OnDisable()
 {
     _planeBuffer?.Release();
     _boxBuffer?.Release();
     _sphereBuffer?.Release();
     _discBuffer?.Release();
     _quadBuffer?.Release();
     _sizeBuffer?.Release();
 }
        public void UpdateComputeBufferSize(int newInstanceCount)
        {
            MergeBuffer?.Release();
            MergeBuffer = null;

            VisibleBufferLOD0?.Release();
            VisibleBufferLOD0 = null;

            VisibleBufferLOD1?.Release();
            VisibleBufferLOD1 = null;

            VisibleBufferLOD2?.Release();
            VisibleBufferLOD2 = null;

            VisibleBufferLOD3?.Release();
            VisibleBufferLOD3 = null;

            ShadowBufferLOD0?.Release();
            ShadowBufferLOD0 = null;

            ShadowBufferLOD1?.Release();
            ShadowBufferLOD1 = null;

            ShadowBufferLOD2?.Release();
            ShadowBufferLOD2 = null;

            ShadowBufferLOD3?.Release();
            ShadowBufferLOD3 = null;

            MergeBuffer = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            MergeBuffer.SetCounterValue(0);

            VisibleBufferLOD0 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            VisibleBufferLOD0.SetCounterValue(0);

            VisibleBufferLOD1 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            VisibleBufferLOD1.SetCounterValue(0);

            VisibleBufferLOD2 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            VisibleBufferLOD2.SetCounterValue(0);

            VisibleBufferLOD3 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            VisibleBufferLOD3.SetCounterValue(0);

            ShadowBufferLOD0 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            ShadowBufferLOD0.SetCounterValue(0);

            ShadowBufferLOD1 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            ShadowBufferLOD1.SetCounterValue(0);

            ShadowBufferLOD2 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            ShadowBufferLOD2.SetCounterValue(0);

            ShadowBufferLOD3 = new ComputeBuffer(newInstanceCount, (16 * 4 * 2) + 16, ComputeBufferType.Append);
            ShadowBufferLOD3.SetCounterValue(0);
        }
        private void VerifyBuffer(int requiredCount)
        {
            if (buffer == null || requiredCount > buffer.count)
            {
                buffer?.Release();

                var newCount = ((requiredCount + BufferGranularity - 1) / BufferGranularity) * BufferGranularity;
                buffer = new ComputeBuffer(newCount, UnsafeUtility.SizeOf <Line>());
                lineMaterial.SetBuffer(BufferProperty, buffer);
            }
        }
    void InitializeNeuronFeedDataCBuffer()
    {
        neuronFeedDataCBuffer?.Release();
        neuronFeedDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 1);
        NeuronFeedData[] neuronValuesArray = new NeuronFeedData[numNeurons];

        for (int i = 0; i < neuronValuesArray.Length; i++)
        {
            neuronValuesArray[i].curValue = neurons[i].currentValue;
        }

        neuronFeedDataCBuffer.SetData(neuronValuesArray);
    }
        private void OnDisable()
        {
            allInstancesPosWSBuffer?.Release();
            allInstancesPosWSBuffer = null;

            visibleInstancesOnlyPosWSIDBuffer?.Release();
            visibleInstancesOnlyPosWSIDBuffer = null;

            argsBuffer?.Release();
            argsBuffer = null;

            instance = null;
        }
示例#10
0
        private void InitSpheresBuffer()
        {
            sphereBuffer?.Release();
            var spheresInfo = new List <SphereInfo>();

            spheres.ForEach(s =>
            {
                spheresInfo.Add(s.GetSphereInfo());
//                s.gameObject.SetActive(false);
            });
            sphereBuffer = new ComputeBuffer(spheres.Count, 56);
            sphereBuffer.SetData(spheresInfo);
        }
示例#11
0
    private void OnDestroy()
    {
        _nodesBuffer?.Release();
        _woopTrisBuffer?.Release();
        _triIndicesBuffer?.Release();

        _verticesBuffer?.Release();
        _normalsBuffer?.Release();
        _triIndicesBuffer?.Release();

        _trianglesBuffer?.Release();
        _materialsBuffer?.Release();
        _matIdxBuffer?.Release();
    }
示例#12
0
 private void OnDisable()
 {
     _SphereBuffer?.Release();
     _MeshObjectBuffer?.Release();
     _MeshMaterialBuffer?.Release();
     _VertexBuffer?.Release();
     _IndexBuffer?.Release();
     _FrustumBuffer?.Release();
     _TriangleBuffer?.Release();
     if (_TextureBuffer != null)
     {
         Destroy(_TextureBuffer);
     }
 }
示例#13
0
        private void UpdateShaderParameters()
        {
            mandelbrotComputeShader.SetFloat(scaleId, scale);
            mandelbrotComputeShader.SetVector(lowerLeftId, lowerLeft);
            mandelbrotComputeShader.SetInt(maxIterationsId, maxIterations);
            mandelbrotComputeShader.SetInt(colorLevelsId, colorLevels);

            if (colors.Length != colorsBuffer?.count)
            {
                colorsBuffer?.Release();
                colorsBuffer = new ComputeBuffer(colors.Length, 4 * sizeof(float));
            }
            colorsBuffer.SetData(colors);
            mandelbrotComputeShader.SetBuffer(colourEscapeTimeKernelId, colorsBufferId, colorsBuffer);
        }
    // For now only one seed data
    void InitializeNeuronCBufferData()
    {
        neuronInitDataCBuffer?.Release();
        neuronInitDataCBuffer = new ComputeBuffer(numNeurons, sizeof(float) * 3);

        NeuronInitData[] neuronInitDataArray = new NeuronInitData[neurons.Count]; //[numNeurons];

        for (int x = 0; x < neuronInitDataArray.Length; x++)
        {
            NeuronInitData neuronData = new NeuronInitData((float)neurons[x].io / 2.0f);
            neuronInitDataArray[x] = neuronData;
        }

        neuronInitDataCBuffer.SetData(neuronInitDataArray);
    }
示例#15
0
    public override void Cleanup()
    {
        quadVerticesCBuffer?.Release();
        waterCurveVerticesCBuffer?.Release();
        waterCurveStrokesCBuffer?.Release();
        waterQuadStrokesCBufferLrg?.Release();
        waterQuadStrokesCBufferSml?.Release();
        waterNutrientsBitsCBuffer?.Release();
        waterSurfaceBitsCBuffer?.Release();
        waterRipplesCBuffer?.Release();
        //waterSurfaceBitsShadowsCBuffer?.Release();
        waterDebrisBitsCBuffer?.Release();
        waterDebrisBitsShadowsCBuffer?.Release();
        waterChains0CBuffer?.Release();
        waterChains1CBuffer?.Release();

        if (waterSurfaceDataRT0 != null)
        {
            waterSurfaceDataRT0.Release();
        }
        if (waterSurfaceDataRT1 != null)
        {
            waterSurfaceDataRT1.Release();
        }
    }
 void OnDestroy()
 {
     m_argsBuffer?.Release();
     m_boxDataBuffer?.Release();
     m_normalsBuffer?.Release();
     m_positionsBuffer?.Release();
 }
示例#17
0
 public void Release()
 {
     meshPropertiesBuffer?.Release();
     meshPropertiesBuffer = null;
     argsBuffer?.Release();
     argsBuffer = null;
 }
        private void RunBufferCleanUp()
        {
            empty.Release();
            m_topLevelAcc.Release();
            m_topLevelAccGeoMap.Release();
            m_primitiveBuffer.Release();
            m_worldToPrimitiveBuffer.Release();
            foreach (var item in m_gemoetryInstanceBuffer)
            {
                item.Value?.Release();
            }
            m_gemoetryInstanceBuffer.Clear();
            foreach (var item in m_objectLevelAccGeoBuffers)
            {
                item.Value?.Release();
            }
            m_objectLevelAccGeoBuffers.Clear();
            foreach (var item in m_objectLevelAccGeoMapBuffers)
            {
                item.Value?.Release();
            }
            m_objectLevelAccGeoMapBuffers.Clear();
            m_lightInfoBuffer?.Release();

            foreach (var materialBuffers in computeBufferForMaterials)
            {
                materialBuffers.Release();
            }
            computeBufferForMaterials.Clear();
        }
示例#19
0
    //Setup all buffers and variables
    private void Update()
    {
        //Recreate the buffer
        bufferElements.Clear();
        foreach (Building building in buildings)
        {
            BuildingBufferElement element = new BuildingBufferElement
            {
                PositionX = building.transform.position.x,
                PositionY = building.transform.position.z,
                Range     = building.Range,
                Heat      = building.Heat
            };

            bufferElements.Add(element);
        }

        buffer?.Release();
        buffer = new ComputeBuffer(bufferElements.Count * 4, sizeof(float));

        //Set the buffer data and parse it to the compute shader
        buffer.SetData(bufferElements);
        computeShader.SetBuffer(0, buildingBufferId, buffer);

        //Set other variables needed in the compute function
        computeShader.SetInt(buildingCountId, bufferElements.Count);

        //Execute the compute shader
        //Our thread group size is 8x8=64,
        //thus we have to dispatch (TextureSize / 8) * (TextureSize / 8) thread groups
        computeShader.Dispatch(0, Mathf.CeilToInt(TextureSize / 8.0f), Mathf.CeilToInt(TextureSize / 8.0f), 1);
    }
 void OnDestroy()
 {
     m_vectorFieldBuffer?.Release();
     m_positionBuffer?.Release();
     m_normalBuffer?.Release();
     m_boidsDataBuffer?.Release();
 }
 protected void EraseGpu()
 {
     dataBuffer?.Release();
     shapeBuffer?.Release();
     stridesBuffer?.Release();
     dataOnGpu = false;
 }
示例#22
0
 public void ReleaseBuffers()
 {
     _featurePointBuffer?.Release();
     _quadsBuffer?.Release();
     _indicesBuffer?.Release();
     _verticesArgumentBuffer?.Release();
 }
        void CreateOrResizeVtxBuffer(ref ComputeBuffer buffer, int count)
        {
            int num = ((count - 1) / 256 + 1) * 256;

            buffer?.Release();
            buffer = new ComputeBuffer(num, UnsafeUtility.SizeOf <ImDrawVert>());
        }
 private void OnDisable()
 {
     sphereBuffer?.Release();
     meshObjectBuffer?.Release();
     vertexBuffer?.Release();
     indexBuffer?.Release();
 }
示例#25
0
 void ReleaseBuffers()
 {
     entityMeshPropertiesBuffer?.Release();
     entityMeshPropertiesBuffer = null;
     entityArgsBuffer?.Release();
     entityArgsBuffer = null;
 }
示例#26
0
        protected override void Deinitialize()
        {
            Active.ForEach(req =>
            {
                req.TextureSet.Release();
            });

            foreach (var tex in AvailableRenderTextures)
            {
                tex.Release();
            }
            foreach (var tex in AvailableTextures)
            {
                DestroyImmediate(tex);
            }

            PointCloudBuffer?.Release();
            CosLatitudeAnglesBuffer?.Release();
            SinLatitudeAnglesBuffer?.Release();

            if (PointCloudMaterial != null)
            {
                DestroyImmediate(PointCloudMaterial);
            }
        }
        void CreateOrResizeArgBuffer(ref ComputeBuffer buffer, int count)
        {
            int num = ((count - 1) / 256 + 1) * 256;

            buffer?.Release();
            buffer = new ComputeBuffer(num, UnsafeUtility.SizeOf <int>(), ComputeBufferType.IndirectArguments);
        }
        private void ClearEverything()
        {
            _snapshotBuffer?.Release();
            _vertexBuffer?.Release();
            _fillArgsBuffer?.Release();
            _lineArgsBuffer?.Release();
            _latestVerticesBuffer?.Release();

            if (_lineMat != null)
            {
                Destroy(_lineMat);
            }
            if (_fillMat != null)
            {
                Destroy(_fillMat);
            }

            if (_snapshotCompute != null)
            {
                Destroy(_snapshotCompute);
            }
            if (_vertexCompute != null)
            {
                Destroy(_vertexCompute);
            }
        }
示例#29
0
        public virtual void OnDestroy()
        {
            Active.ForEach(req =>
            {
                req.TextureSet.Release();
            });

            foreach (var tex in AvailableRenderTextures)
            {
                tex.Release();
            }
            foreach (var tex in AvailableTextures)
            {
                DestroyImmediate(tex);
            }

            PointCloudBuffer?.Release();
            CosLatitudeAnglesBuffer?.Release();
            SinLatitudeAnglesBuffer?.Release();

            if (PointCloudMaterial != null)
            {
                DestroyImmediate(PointCloudMaterial);
            }
        }
示例#30
0
    private void UpdateLightBuffer(CullingResults cullingResults)
    {
        _LightBuffer?.Release();
        _LightBuffer = new ComputeBuffer(maxLightCount, System.Runtime.InteropServices.Marshal.SizeOf <LightSource>());

        List <LightSource> lightPosRadius = new List <LightSource>();

        for (int i = 0; i < cullingResults.visibleLights.Length; ++i)
        {
            var light = cullingResults.visibleLights[i];
            if (light.light.enabled == true)
            {
                LightSource l = new LightSource();
                l.position = new Vector3(light.light.transform.position.x, light.light.transform.position.y,
                                         light.light.transform.position.z);
                if (light.lightType == LightType.Directional || light.lightType == LightType.Spot)
                {
                    l.direction = light.light.transform.forward;
                    l.direction = light.light.transform.localToWorldMatrix.GetColumn(2);
                }
                l.color = light.finalColor;
                if (light.lightType == LightType.Spot)
                {
                    l.spotAngle = light.spotAngle;
                }
                l.range = light.range;
                l.type  = (uint)light.lightType;
                lightPosRadius.Add(l);
            }
        }

        _LightBuffer.SetData(lightPosRadius);
        _lightCount = lightPosRadius.Count;
    }