void ApplyLights(ref ScriptableRenderContext context, ref CullingResults cullingResults) { colorsBuffer = CreateBuffer(colors); ShaderInput.SetLightsColors(buffer, colorsBuffer); positionsBuffer = CreateBuffer(positions); ShaderInput.SetLightsPositions(buffer, positionsBuffer); spotDirectionsBuffer = CreateBuffer(spotDirections); ShaderInput.SetLightsSpotDirections(buffer, spotDirectionsBuffer); attenuationsBuffer = CreateBuffer(attenuations); ShaderInput.SetLightsAttenuations(buffer, attenuationsBuffer); if (cullingResults.lightAndReflectionProbeIndexCount >= 1) { lightIndicesBuffer = new ComputeBuffer(cullingResults.lightAndReflectionProbeIndexCount, 4); cullingResults.FillLightAndReflectionProbeIndices(lightIndicesBuffer); ShaderInput.SetLightIndices(buffer, lightIndicesBuffer); } SubmitBuffer(ref context, buffer); }
public void SetupPerObjectLightIndices(ref CullingResults cullResults, ref LightData lightData) { if (lightData.additionalLightsCount == 0) { return; } var visibleLights = lightData.visibleLights; var perObjectLightIndexMap = cullResults.GetLightIndexMap(Allocator.Temp); int directionalLightsCount = 0; int additionalLightsCount = 0; // Disable all directional lights from the perobject light indices // Pipeline handles them globally. for (int i = 0; i < visibleLights.Length; ++i) { if (additionalLightsCount >= maxVisibleAdditionalLights) { break; } VisibleLight light = visibleLights[i]; if (light.lightType == LightType.Directional) { perObjectLightIndexMap[i] = -1; ++directionalLightsCount; } else { perObjectLightIndexMap[i] -= directionalLightsCount; ++additionalLightsCount; } } // Disable all remaining lights we cannot fit into the global light buffer. for (int i = directionalLightsCount + additionalLightsCount; i < visibleLights.Length; ++i) { perObjectLightIndexMap[i] = -1; } cullResults.SetLightIndexMap(perObjectLightIndexMap); perObjectLightIndexMap.Dispose(); // if not using a compute buffer, engine will set indices in 2 vec4 constants // unity_4LightIndices0 and unity_4LightIndices1 if (useStructuredBufferForLights) { int lightIndicesCount = cullResults.lightAndReflectionProbeIndexCount; if (lightIndicesCount > 0) { if (perObjectLightIndices == null) { perObjectLightIndices = new ComputeBuffer(lightIndicesCount, sizeof(int)); } else if (perObjectLightIndices.count < lightIndicesCount) { perObjectLightIndices.Release(); perObjectLightIndices = new ComputeBuffer(lightIndicesCount, sizeof(int)); } cullResults.FillLightAndReflectionProbeIndices(perObjectLightIndices); } } }