IProbeIntegrator.IntegrateOcclusion
Declaration
public LightTransport.IProbeIntegrator.Result IntegrateOcclusion(LightTransport.IDeviceContext context, int positionOffset, int positionCount, int sampleCount, int maxLightsPerProbe, BufferSlice<int> perProbeLightIndices, BufferSlice<float> probeOcclusionEstimateOut);Параметры
| Параметр | Описание |
|---|---|
| контекст | Контекст устройства для вычислений и операций памяти. |
| positionOffset | Начальный индекс в буфере положения зонда. |
| positionCount | Число позиций зонда для обработки. |
| sampleCount | Число направленных проб, отбираемых с помощью каждого пробника. |
| maxLightsPerProbe | Максимальное число огней для расчета окклюзии на зонд (обычно 4). |
| perProbeLightIndices | Буфер, содержащий световые индексы для каждого пробника, рассчитанные с использованием ,InputExtraction.ComputeOcclusionLightIndicesFromBakeInput,. |
| probeOcclusionEstimateOut | Выходный буфер для значений окклюзии. Размер должен быть positionCount × maxLightsPerProbe × sizeof(float). |
Возвращаемое значение
Результат Результат, указывающий на успех или неудачу с подробной информацией об ошибке.
Описание
Вычисляет значения окклюзии для сценариев смешанного освещения с поддержкой shadowmask.
Этот метод рассчитывает коэффициенты окклюзии для смешанных источников света в каждом положении зонда. Смешанные источники света — это источники света, которые обеспечивают как динамическое освещение в реальном времени, так и печеные тени через маски теней.
Расчет окклюзии:
- Значение 1.0: отсутствие окклюзии (свет полностью видим).
- Значения от 0 до 1: частичное окклюзионное состояние.
- Значение 0.0: полная окклюзия (свет полностью блокируется).
Индексы освещенности можно предварительно рассчитать с помощью InputExtraction.ComputeOcclusionLightIndicesFromBakeInput для выбора наиболее влиятельных огней для каждого положения зонда.
Дополнительные ресурсы: InputExtraction.ComputeOcclusionLightIndicesFromBakeInput, InputExtraction.GetShadowmaskChannelsFromLightIndices.
// Compute light indices for occlusion var probePositions = GetProbePositions(); // Vector3[] var lightIndices = InputExtraction.ComputeOcclusionLightIndicesFromBakeInput(bakeInput, probePositions, 4);
// Create buffer for light indices BufferID lightIndexBuffer = context.CreateBuffer((ulong)(probePositions.Length * 4), sizeof(int)); var lightIndexSlice = new BufferSlice<int>(lightIndexBuffer, 0); context.WriteBuffer(lightIndexSlice, new NativeArray<int>(lightIndices, Allocator.Temp));
// Create output buffer for occlusion values BufferID occlusionBuffer = context.CreateBuffer((ulong)(probePositions.Length * 4), sizeof(float)); var occlusionSlice = new BufferSlice<float>(occlusionBuffer, 0);
// Compute occlusion var result = integrator.IntegrateOcclusion(context, 0, probePositions.Length, 512, 4, lightIndexSlice, occlusionSlice);
Assert.AreEqual(IProbeIntegrator.ResultType.Success, result.type);