109 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
		
		
			
		
	
	
			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 |