Unity 6.3
0 онлайн 89 гостей 3 в системе
Вход

RayTracingAccelerationStructure.AddInstances

Declaration

public int AddInstances(ref Rendering.RayTracingMeshInstanceConfig config, T[] instanceData, int instanceCount = -1, int startInstance = 0, uint id);
public int AddInstances(ref Rendering.RayTracingMeshInstanceConfig config, List<T> instanceData, int instanceCount = -1, int startInstance = 0, uint id);
public int AddInstances(ref Rendering.RayTracingMeshInstanceConfig config, NativeArray<T> instanceData, int instanceCount = -1, int startInstance = 0, uint id);
public int AddInstances(ref Rendering.RayTracingMeshInstanceConfig config, NativeSlice<T> instanceData, uint id);

Параметры

Параметр Описание
конфигурация Общие параметры, используемые этим массивом экземпляра Mesh для трассирования лучей.
instanceData Массив данных экземпляра, используемый экземплярами Mesh для отслеживания лучей.
instanceCount Количество экземпляров, добавляемых в структуру ускорения. Когда этот аргумент равен -1 (по умолчанию), Unity добавляет все экземпляры из startInstance в конец массива instanceData.
startInstance Первый экземпляр в instanceData для добавления в структуру ускорения.
Идентификатор Необязательное значение экземпляра ID, которое можно получить в HLSL с помощью функции InstanceID(). Unity назначает последовательный экземпляр IDs каждому экземпляру сетки, начиная со значения id.

Возвращаемое значение

инт Значение, представляющее обработчик, который можно использовать для выполнения последующих действий (e.g. RemoveInstance, UpdateInstancePropertyBlock), или 0, если экземпляры не добавлены успешно.

Описание

Добавляет массив экземпляров Mesh с трассировкой лучей в RayTracingAccelerationStructure.

Переданный instanceData может быть либо массивом Matrix4x4 (преобразование объекта в мир на экземпляр), либо структурой данных. Когда instanceData является структурой данных, структура может содержать следующие члены:

  • Matrix4x4 objectToWorld (обязательно) — указывает матрицу преобразования объекта в мир на экземпляр
  • uint renderingLayerMask (необязательно) — указывает маску слоя для отображения на экземпляр
  • Matrix4x4 prevObjectToWorld (необязательно) — указывает матрицу преобразования объекта в мир в каждом предыдущем кадре (используется для расчета вектора движения)

Эти члены могут появляться в любом порядке в структуре, но они должны иметь вышеуказанное имя и тип. AddInstances игнорирует любые другие члены, которые вы включаете в структуру для собственного использования. В следующем примере пользовательской структуры определены обязательный член objectToWorld, необязательный член renderingLayerMask и пользовательский член веса (функция AddInstances игнорирует этот член).

struct MyInstanceData
{
    public Matrix4x4 objectToWorld; // We must specify object-to-world transformation for each instance
    public uint renderingLayerMask; // Optional per-instance rendering layer mask.
    public float weight; // Additional per-instance data unrelated to rendering.
};

Для оптимальной производительности CPU, MyInstanceData должен содержать только член objectToWorld, в противном случае Unity должен деинтерлейпировать данные.

Когда AddInstances используется, Unity включает ключевое слово INSTANCING_ON shader. Чтобы объявить ключевое слово shader в HLSL, добавьте #pragma multi_compile _ INSTANCING_ON в Shader Pass, указанный в RayTracingShader.SetShaderPass или CommandBuffer.SetRayTracingShaderPass. Для доступа к данным по экземплярам относительно этого массива экземпляров трассирования лучей, используйте InstanceIndex() - unity_BaseInstanceID в качестве индекса экземпляра в HLSL. Например, если член prevObjectToWorld присутствует в структуре MyInstanceData, Unity копирует значения в буфер unity_PrevObjectToWorldArray, который вы можете определить в HLSL как StructuredBuffer<float4x4> unity_PrevObjectToWorldArray;. Затем вы можете индексировать буфер с помощью InstanceIndex() - unity_BaseInstanceID difference. Следующий фрагмент кода HLSL демонстрирует, как вычислить вектор скорости пространства-времени, который выводится в полезной нагрузке луча:

#pragma multi_compile _ INSTANCING_ON

struct AttributeData { float2 barycentrics; };

struct RayPayload { float3 velocity; };

// Built-in shader variables: StructuredBuffer<float4x4> unity_PrevObjectToWorldArray; float4x4 unity_MatrixPreviousM; uint unity_BaseInstanceID;

static uint unity_InstanceID;

[shader("closesthit")] void ClosestHitMain(inout RayPayload payload, AttributeData attribs) { float3 localPos = ObjectRayOrigin() + RayTCurrent() * ObjectRayDirection();

#if INSTANCING_ON unity_InstanceID = InstanceIndex() - unity_BaseInstanceID; float3 prevWorldPos = mul(unity_PrevObjectToWorldArray[unity_InstanceID], float4(localPos, 1)).xyz; #else float3 prevWorldPos = mul(unity_MatrixPreviousM, float4(localPos, 1)).xyz; #endif float3 worldPos = WorldRayOrigin() + RayTCurrent() * WorldRayDirection();

payload.velocity = worldPos - prevWorldPos; }

В зависимости от параметров в аргументе config и пользовательской структуры instanceData, AddInstances настроит и привязает следующие встроенные StructuredBuffers для попадания на шейдеры:

  • unity_PrevObjectToWorldArray (float4x4) — когда член prevObjectToWorld присутствует в структуре instanceData.
  • unity_RenderingLayerArray (float) — когда член renderingLayerMask присутствует в структуре instanceData.
  • unity_SHArArray, unity_SHAgArray, unity_SHAbArray, unity_SHBrArray, unity_SHBgArray, unity_SHBbArray, unity_SHCArray (float4) — коэффициенты сферических гармоник (используемые зондами окружающего и светового излучения), когда config.lightProbeUsage равен ,LightProbeUsage.Off, (только зонд окружающего излучения), ,LightProbeUsage.BlendProbes, или ,LightProbeUsage.UseProxyVolume, (когда config.lightProbeProxyVolume.qualityMode установлен на ,LightProbeProxyVolume.QualityMode.Normal,).

Примечание: AddInstances не устанавливает и не связывает unity_ObjectToWorldArray или unity_WorldToObjectArray буферов, так как вы можете получить доступ к матрицам трансформации экземпляров трассирования лучей в hit shaders, используя ObjectToWorld() или WorldToObject() HLSL внутренние.

Вы можете использовать эту функцию, чтобы добавить максимум 1048575 экземпляров Mesh с трассированием лучей. Окончательное количество экземпляров зависит от startInstance и instanceCount Вы можете получить доступ к количеству экземпляров в HLSL использование unity_InstanceCount встроенная униформа.

AddInstances броски InvalidOperationException если Материал, указанный в параметре config, не имеет Material.enableInstancing установленное значение true. После добавления всех требуемых экземпляров используйте RayTracingAccelerationStructure.Build или CommandBuffer.BuildRayTracingAccelerationStructure построить ускорительную структуру на GPU.

Эта функциональность не имеет никаких особых требований к оборудованию в дополнение к поддержке трассирования лучей (SystemInfo.supportsRayTracing должно быть верно). DirectX Лучеслежение (DXR), эта функция заставляет все экземпляры трассирования лучей в массиве использовать только одну запись шейдера из таблицы шейдеров, тем самым уменьшая CPU нагрузка на поток рендеринга для привязки GPU ресурсов, чтобы попасть в шейдеры.

Дополнительные ресурсы: RayTracingAccelerationStructure.AddInstance, RayTracingAccelerationStructure.RemoveInstance.