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; } }
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; } }