版本: Unity 6 (6000.0)
语言English
  • C#

RayTracingShader.Dispatch

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法采纳所有提交内容,但我们确实会阅读用户提出的每个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void Dispatch(string rayGenFunctionName, int width, int height, int depth, Camera camera);

参数

rayGenFunctionName 射线生成着色器的名称。
width 射线生成着色器线程网格的宽度。
height 射线生成着色器线程网格的高度。
depth 射线生成着色器线程网格的深度。
camera 用于设置与摄像机相关的内置着色器变量的可选参数。

描述

分派此 RayTracingShader

当执行射线生成着色器时,GPU 会启动一个 3D 线程网格。在 HLSL 中,可以使用 DispatchRaysDimensions() 函数检索 width、height 和 depth 的值。要检索射线生成着色器调用的索引,可以使用 DispatchRaysIndex() HLSL 函数。

Width、height 和 depth 必须大于零,并且 width*height*depth <= 2^30。

当指定可选的 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> 替换为以下值之一:native16bitint64int64bufferatomics
  • #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 内置着色器变量。您必须将 Camera 指定为 Dispatch 函数的参数才能正确设置此值。

其他资源:SystemInfo.supportsRayTracingShadersRayTracingAccelerationStructure