CommandBuffer.DispatchRays
Declaration
public void DispatchRays(Rendering.RayTracingShader rayTracingShader, string rayGenName, uint width, uint height, uint depth, Camera camera);public void DispatchRays(Rendering.RayTracingShader rayTracingShader, string rayGenName, GraphicsBuffer argsBuffer, uint argsOffset, Camera camera);Параметры
| Параметр | Описание |
|---|---|
| rayTracingShader | RayTracingShader для исполнения. |
| rayGenName | Имя шейдера генерации лучей. |
| ширина | Ширина сетки потока шейдера генерации лучей. |
| высота | Высота сетки потока шейдера генерации лучей. |
| глубина | Глубина сетки потока шейдера генерации лучей. |
| камера | Необязательный параметр, используемый для настройки встроенных переменных шейдера, связанных с камерой. |
| argsBuffer | Буфер, содержащий параметры отправки для косвенного DispatchRays. |
| argsOffset | Байт смещен в argsBuffer, где начинаются размеры отправки. |
Описание
Добавление команды для выполнения RayTracingShader.
Когда командный буфер выполняется, GPU запускает потоки шейдера генерации лучей, которые вы указываете в качестве аргумента для этого метода.
Получить значения ширины, высоты и глубины с помощью HLSL DispatchRaysDimensions() функция. Получить значения индекса вызова генератора лучей с помощью HLSL DispatchRaysIndex() функции.
Ширина, высота и глубина должны быть выше нуля, а ширина*высота*глубина <= 2^30. argsBuffer и argsOffset аргументы в пользу косвенного CommandBuffer.DispatchRays вызов, буфер с аргументами, argsBuffer, должно содержать три целых числа при заданной argsOffset значения, отражающие размеры отправки: ширина, высота и глубина.
Когда факультативное Camera указывается в качестве параметра, встроенные переменные шейдера, связанные Camera, Экран и Время настроены. Проверить Встроенные переменные шейдера полный список этих переменных.
A RayTracingShader поддерживает только следующие типы шейдеров: ray generation, miss и callable.
Вы можете использовать следующие директивы pragma в файле лучевой траектории:
#pragma max_recursion_depth <value>— сколько раз вы можете рекурсивно вызватьTraceRayв HLSL. Значение 1 означает, что вы можете вызватьTraceRayтолько из шейдеров генерации лучей. Превышение объявленной глубины рекурсии приведет к неопределенному поведению, включая сбои GPU.#pragma enable_ray_tracing_shader_debug_symbols— вставляет файлы базы данных программ (PBD) в двоичные файлы шейдеров, чтобы сделать отладку шейдеров доступной в отладчиках, таких как PIX.#pragma only_renderers <values>— компилирует эту программу только для данной графики APIs. Список значений см. в Направление на графику APIs и платформы в HLSL.#pragma exclude_renderers <values>— не компилировать эту программу для данной графики APIs. Список значений см. в Направление на графику APIs и платформы в HLSL.#pragma require <values>— минимальный набор возможностей GPU, с которым совместим этот шейдер. Замените <value> одним из следующих значений:native16bit,int64,int64bufferatomics.#pragma disable_ray_payload_size_checks— отключает проверку совместимости размера полезной нагрузки между различными типами шейдеров для трассирования лучей. Используйте это осторожно, так как удаление проверки может привести к повреждению данных полезной нагрузки при смешивании несовместимых шейдеров для трассирования лучей, использующих различные полезные нагрузки.
#include "UnityShaderVariables.cginc"
#pragma max_recursion_depth 1
// Input RaytracingAccelerationStructure g_SceneAccelStruct; float g_Zoom; //Mathf.Tan(Mathf.Deg2Rad * Camera.main.fieldOfView * 0.5f)
// Output RWTexture2D<float4> g_Output;
struct RayPayload { float4 color; };
[shader("miss")] void MainMissShader(inout RayPayload payload : SV_RayPayload) { payload.color = float4(0, 0, 1, 1); }
[shader("raygeneration")] void MainRayGenShader() { uint2 launchIndex = DispatchRaysIndex().xy; uint2 launchDim = DispatchRaysDimensions().xy;
float2 frameCoord = float2(launchIndex.x, launchDim.y - launchIndex.y - 1) + float2(0.5, 0.5);
float2 ndcCoords = frameCoord / float2(launchDim.x - 1, launchDim.y - 1);
ndcCoords = ndcCoords * 2 - float2(1, 1); ndcCoords = ndcCoords * g_Zoom;
float aspectRatio = (float)launchDim.x / (float)launchDim.y;
float3 viewDirection = normalize(float3(ndcCoords.x * aspectRatio, ndcCoords.y, 1));
// Rotate the ray from view space to world space. float3 rayDirection = normalize(mul((float3x3)unity_CameraToWorld, viewDirection));
RayDesc ray; ray.Origin = _WorldSpaceCameraPos; ray.Direction = rayDirection; ray.TMin = 0.0f; ray.TMax = 1000.0f;
RayPayload payload; payload.color = float4(0, 0, 0, 0);
uint missShaderIndex = 0; TraceRay(g_SceneAccelStruct, 0, 0xFF, 0, 1, missShaderIndex, ray, payload);
g_Output[frameCoord] = payload.color; }
struct AttributeData { float2 barycentrics; };
[shader("closesthit")] void DefaultClosestHitMain(inout RayPayload payload : SV_RayPayload, AttributeData attribs : SV_IntersectionAttributes) { payload.color = float4(1, 0, 0, 1); }
В этом примере шейдера генерации лучей вы рассчитываете направление луча на основе 2D индекс потока, возвращенный DispatchRaysIndex() функция. Выход красный, если есть пересечение луча/треугольника. Когда нет пересечения, вывод красный. GPU исполняет MainMissShader В этом примере используется unity_CameraToWorld встроенной переменной шейдера. Вы должны указать Camera в качестве аргумента в пользу DispatchRays функции для правильной установки этого значения.
Дополнительные ресурсы: SystemInfo.supportsRayTracingShaders, RayTracingAccelerationStructure, RayTracingShader.DispatchIndirect.