RayTracingShader.Dispatch
Declaration
public void Dispatch(string rayGenFunctionName, int width, int height, int depth, Camera camera);Параметры
| Параметр | Описание |
|---|---|
| rayGenFunctionName | Имя шейдера генерации лучей. |
| ширина | Ширина сетки потока шейдера генерации лучей. |
| высота | Высота сетки потока шейдера генерации лучей. |
| глубина | Глубина сетки потока шейдера генерации лучей. |
| камера | Необязательный параметр, используемый для настройки встроенных переменных шейдера, связанных с камерой. |
Описание
Отправляет это RayTracingShader.
При выполнении шейдера генерации лучей, GPU запускает 3D сетку потоков. В HLSL значения ширины, высоты и глубины могут быть получены с помощью функции DispatchRaysDimensions(). Для получения индекса вызова шейдера генерации лучей можно использовать функцию DispatchRaysIndex() HLSL.
Ширина, высота и глубина должны быть выше нуля и width*height*depth <= 2^30.
Когда дополнительный Camera указан в качестве параметра, устанавливаются встроенные переменные шейдера, связанные с Camera, Screen и Time. Проверьте Встроенные переменные шейдера для полного списка этих переменных.
В файле отслеживания лучей можно использовать следующие директивы 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(1, 1, 1, 1);
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 в качестве аргумента в пользу Dispatch функции для правильной установки этого значения.
Дополнительные ресурсы: SystemInfo.supportsRayTracingShaders, RayTracingAccelerationStructure.