UnityGame/Library/PackageCache/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/TraceRay.hlsl
2024-10-27 10:53:47 +03:00

109 lines
3.8 KiB
HLSL

#ifndef _UNIFIEDRAYTRACING_TRACERAY_HLSL_
#define _UNIFIEDRAYTRACING_TRACERAY_HLSL_
#include "Packages/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/Bindings.hlsl"
namespace UnifiedRT {
static const uint kRayFlagNone = 0x0;
static const uint kRayFlagCullBackFacingTriangles = 0x10;
static const uint kRayFlagCullFrontFacingTriangles = 0x20;
#if defined(UNIFIED_RT_BACKEND_HARDWARE)
Hit TraceRayClosestHit(DispatchInfo dispatchInfo, RayTracingAccelStruct accelStruct, uint instanceMask, Ray ray, uint rayFlags)
{
RayDesc rayDesc;
rayDesc.Origin = ray.origin;
rayDesc.TMin = ray.tMin;
rayDesc.Direction = ray.direction;
rayDesc.TMax = ray.tMax;
Hit payload;
TraceRay(accelStruct.accelStruct, RAY_FLAG_FORCE_OPAQUE | rayFlags, instanceMask, 0, 1, 0, rayDesc, payload);
return payload;
}
bool TraceRayAnyHit(DispatchInfo dispatchInfo, RayTracingAccelStruct accelStruct, uint instanceMask, Ray ray, uint rayFlags)
{
RayDesc rayDesc;
rayDesc.Origin = ray.origin;
rayDesc.TMin = ray.tMin;
rayDesc.Direction = ray.direction;
rayDesc.TMax = ray.tMax;
Hit payLoadShadow = (Hit)0;
TraceRay(accelStruct.accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER | RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | rayFlags, instanceMask, 0, 1, 0, rayDesc, payLoadShadow);
return payLoadShadow.IsValid();
}
#elif defined(UNIFIED_RT_BACKEND_COMPUTE)
int GetCullMode(uint rayFlags)
{
int cullMode = CULL_MODE_NONE;
if (rayFlags & kRayFlagCullFrontFacingTriangles)
cullMode = CULL_MODE_FRONTFACE;
if (rayFlags & kRayFlagCullBackFacingTriangles)
cullMode = CULL_MODE_BACKFACE;
return cullMode;
}
Hit TraceRayClosestHit(DispatchInfo dispatchInfo, RayTracingAccelStruct accelStruct, uint instanceMask, Ray ray, uint rayFlags)
{
TraceParams traceParams;
traceParams.bvh = accelStruct.bvh;
traceParams.bottom_bvhs = accelStruct.bottom_bvhs;
traceParams.bottom_bvh_leaves = accelStruct.bottom_bvh_leaves;
traceParams.stack = g_stack;
traceParams.instance_infos = accelStruct.instance_infos;
traceParams.globalThreadIndex = dispatchInfo.globalThreadIndex;
traceParams.localThreadIndex = dispatchInfo.localThreadIndex;
traceParams.bottom_bvhs_vertices = accelStruct.vertexBuffer;
traceParams.bottom_bvhs_vertex_stride = accelStruct.vertexStride;
int cull_mode = GetCullMode(rayFlags);
TraceHitResult hitData = TraceRaySoftware(traceParams, ray.origin, ray.tMin, ray.direction, ray.tMax, instanceMask, cull_mode, true);
Hit res;
res.instanceID = hitData.inst_id != -1 ? GetUserInstanceID(traceParams, hitData.inst_id) : -1;
res.primitiveIndex = hitData.prim_id;
res.uvBarycentrics = hitData.uv;
res.hitDistance = hitData.hit_distance;
res.isFrontFace = hitData.front_face;
return res;
}
bool TraceRayAnyHit(DispatchInfo dispatchInfo, RayTracingAccelStruct accelStruct, uint instanceMask, Ray ray, uint rayFlags)
{
TraceParams traceParams;
traceParams.bvh = accelStruct.bvh;
traceParams.bottom_bvhs = accelStruct.bottom_bvhs;
traceParams.bottom_bvh_leaves = accelStruct.bottom_bvh_leaves;
traceParams.stack = g_stack;
traceParams.instance_infos = accelStruct.instance_infos;
traceParams.globalThreadIndex = dispatchInfo.globalThreadIndex;
traceParams.localThreadIndex = dispatchInfo.localThreadIndex;
traceParams.bottom_bvhs_vertices = accelStruct.vertexBuffer;
traceParams.bottom_bvhs_vertex_stride = accelStruct.vertexStride;
int cull_mode = GetCullMode(rayFlags);
TraceHitResult hit = TraceRaySoftware(traceParams, ray.origin, ray.tMin, ray.direction, ray.tMax, instanceMask, cull_mode, false);
return hit.inst_id != INVALID_NODE;
}
#endif
} // namespace UnifiedRT
#endif // UNIFIEDRAYTRACING_TRACERAY_HLSL