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

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.