IWorld
интерфейс в UnityEngine.LightTransport
Описание
Интерфейс для интеграции мировых структур данных, используемых для расчетов в области легкого транспорта.
Этот интерфейс абстрагирует структуры данных мирового пространства, используемые интеграторами: структуры ускорения, таблицы поиска и другие оптимизированные данные, которыми можно делиться между разными операциями интегрирования.
Интерфейс IWorld обеспечивает: — хранение геометрии сцены и данных материалов; — пространственные структуры ускорения для эффективной трассировки лучей; — хранение данных об источниках света и структуры ускорения для быстрого поиска; — общие структуры данных для нескольких проходов интегрирования.
Unity предоставляет конкретную реализацию этого интерфейса: UnityEngine.LightTransport.RadeonRaysWorld — для операций с ускорением на GPU через OpenCL 1.2.
Объекты мира заполняются с помощью InputExtraction.PopulateWorld и потребляемые IProbeIntegrator осуществления.
// Extract scene data for baking. bool extractResult = InputExtraction.ExtractFromScene(out var bakeInput); Assert.IsTrue(extractResult);
// Create context and world for GPU acceleration. using var context = new RadeonRaysContext(); Assert.IsTrue(context.Initialize()); var world = new RadeonRaysWorld();
// Populate world with scene data. using var progress = new BakeProgressState(); bool populateResult = InputExtraction.PopulateWorld(bakeInput, progress, context, world); Assert.IsTrue(populateResult);
// Use world with multiple integrators. var directIntegrator = new RadeonRaysProbeIntegrator(); var indirectIntegrator = new RadeonRaysProbeIntegrator();
// Both integrators can share the same world data. directIntegrator.Prepare(context, world, probePositions, 0.5f, 1); indirectIntegrator.Prepare(context, world, probePositions, 0.1f, 3);
// Perform light integration passes var directResult = directIntegrator.IntegrateDirectRadiance(context, 0, probeCount, 256, false, directBuffer); var indirectResult = indirectIntegrator.IntegrateIndirectRadiance(context, 0, probeCount, 2048, false, indirectBuffer);
// Clean up world.Dispose();