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

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.