Beispiel #1
0
        internal InstancingDraw(InstancingRenderer renderer, ComputeShader visShader, ComputeShader sortShader)
        {
            _renderer   = renderer;
            _visShader  = visShader;
            _sortShader = sortShader;

            SetShadow(renderer.CastShadow, renderer.ReceiveShadow);
            _drawInstanceDataForLod = new ComputeBuffer[MaxLodLevelCount];

            // assume 20 drawcalls at most for each lod level
            var argsArray = new int[ArgCountPerDraw * 20];

            for (int i = 0; i < argsArray.Length; ++i)
            {
                argsArray[i] = 0;
            }

            var lodLevelCount = renderer.LodLevelCount;

            _argsData = new ComputeBuffer[lodLevelCount];

            for (int i = 0; i < lodLevelCount; ++i)
            {
                var lodRenderer = renderer.GetLodRenderer(i);
                var count       = lodRenderer.Renderers.Length;

                int drawCallIndex = 0;
                for (int j = 0; j < count; ++j)
                {
                    if (lodRenderer.Renderers[j] == null)
                    {
                        continue;
                    }

                    for (int k = 0; k < lodRenderer.Renderers[j].SubMeshCount; ++k)
                    {
                        argsArray[drawCallIndex] = lodRenderer.Renderers[j].IndexCount[k];
                        drawCallIndex           += ArgCountPerDraw;
                    }
                }

                if (drawCallIndex != 0)
                {
                    _argsData[i] = new ComputeBuffer(1, drawCallIndex * sizeof(uint), ComputeBufferType.IndirectArguments);
                    _argsData[i].SetData(argsArray);
                }
            }

            if (renderer.LodRatios != null)
            {
                _lodSize   = renderer.LodSize;
                _lodRatios = renderer.LodRatios;
            }
        }
Beispiel #2
0
        internal InstancingDraw(InstancingRenderer renderer, ComputeShader visShader)
        {
            _renderer  = renderer;
            _visShader = visShader;

            SetShadow(ShadowCastingMode.Off, false);
            _drawInstanceData = new ComputeBuffer[MaxLodLevelCount];

            // index count per instance, instance count, start index location, base vertex location, start instance location.
            var argsArray = new int[ArgCountPerDraw * 20];

            for (int i = 0; i < argsArray.Length; ++i)
            {
                argsArray[i] = 0;
            }

            var lodLevelCount = renderer.LodLevelCount;

            _argsData = new ComputeBuffer[lodLevelCount];

            for (int i = 0; i < lodLevelCount; ++i)
            {
                var lodRenderer = renderer.GetLodRenderer(i);
                var count       = lodRenderer.Renderers.Length;

                int drawCallIndex = 0;
                for (int j = 0; j < count; ++j)
                {
                    for (int k = 0; k < lodRenderer.Renderers[j].SubMeshCount; ++k)
                    {
                        argsArray[drawCallIndex] = lodRenderer.Renderers[j].IndexCount[k];
                        drawCallIndex           += ArgCountPerDraw;
                    }
                }
                _argsData[i] = new ComputeBuffer(1, drawCallIndex * sizeof(uint), ComputeBufferType.IndirectArguments);
                _argsData[i].SetData(argsArray);
            }

            if (_lodRatios != null)
            {
                _lodSize   = renderer.LodSize;
                _lodRatios = renderer.LodRatios;
            }
        }