| rayTracingShader | RayTracingShader 要执行。 |
| rayGenName | 射线生成着色器的名称。 |
| width | 射线生成着色器线程网格的宽度。 |
| height | 射线生成着色器线程网格的高度。 |
| depth | 射线生成着色器线程网格的深度。 |
| camera | 用于设置与相机相关的内置着色器变量的可选参数。 |
| argsBuffer | 包含间接 DispatchRays 的调度维度的缓冲区。 |
| argsOffset | argsBuffer 中调度维度开始处的字节偏移量。 |
添加一个命令来执行 RayTracingShader。
当命令缓冲区执行时,GPU 将启动您作为此方法参数指定的射线生成着色器的线程。
使用 HLSL DispatchRaysDimensions() 函数检索宽度、高度和深度值。使用 HLSL DispatchRaysIndex() 函数检索射线生成着色器调用索引值。
宽度、高度和深度必须大于零,并且 width*height*depth <= 2^30。当使用 argsBuffer 和 argsOffset 参数进行间接 CommandBuffer.DispatchRays 调用时,包含参数的缓冲区 argsBuffer 必须在给定的 argsOffset 值处包含三个整数,表示调度维度:宽度、高度和深度。
当可选的 Camera 作为参数指定时,将设置与 Camera、Screen 和 Time 相关的内置着色器变量。有关这些变量的完整列表,请查看 内置着色器变量。
RayTracingShader 仅支持以下着色器类型:射线生成、丢失和可调用。
您可以在射线追踪文件中使用以下 pragma 指令
#pragma max_recursion_depth <value> - 您可以在 HLSL 中递归调用 TraceRay 的次数。值为 1 表示您只能从射线生成着色器中调用 TraceRay。超过声明的递归深度将导致未定义的行为,包括 GPU 崩溃。#pragma enable_ray_tracing_shader_debug_symbols - 将程序数据库 (PBD) 文件嵌入到着色器二进制文件中,以便在 PIX 等调试工具中使用着色器调试。#pragma only_renderers <values> - 仅为给定的图形 API 编译此着色器程序。有关值的列表,请参阅 在 HLSL 中针对图形 API 和平台。#pragma exclude_renderers <values> - 不要为给定的图形 API 编译此着色器程序。有关值的列表,请参阅 在 HLSL 中针对图形 API 和平台。#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, 0, 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; }
在此射线生成着色器示例中,您根据 DispatchRaysIndex() 函数返回的 2D 线程索引计算射线方向。如果存在射线/三角形相交,则输出为白色。当不存在相交时,GPU 将执行 MainMissShader,输出为黑色。此示例使用 unity_CameraToWorld 内置着色器变量。您必须为 DispatchRays 函数指定一个 Camera,以便正确设置此值。
其他资源:SystemInfo.supportsRayTracingShaders、RayTracingAccelerationStructure、RayTracingShader.DispatchIndirect。