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.