You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

115 lines
3.9 KiB

#ifndef RAY_TRACING_COMMON_HLSL
#define RAY_TRACING_COMMON_HLSL
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingSampling.hlsl"
#if SHADER_API_GAMECORE_XBOXSERIES
// On GameCore we currently don't support recursive raytracing modes, so stripping TraceRay from hit group shaders will enforces this and allow better shader optimization
// SHADER_STAGE_RAYTRACING is defined only for shaders imported from raytrace files ( note: SHADER_STAGE_RAY_TRACING is defined for all raytracing shaders including hitgroups )
#if !SHADER_STAGE_RAYTRACING
#define TraceRay(d2p_accelStruct,d2p_rayFlags,d2p_instanceMask,d2p_contribution,d2p_multiplier,d2p_missShader,d2p_ray,d2p_payload) ;//TraceRay()_removed_in_function_shader
#endif
#endif
// This array converts an index to the local coordinate shift of the half resolution texture
static const uint2 HalfResIndexToCoordinateShift[4] = { uint2(0,0), uint2(1, 0), uint2(0, 1), uint2(1, 1) };
// Heuristic mapping from roughness (GGX in particular) to ray spread angle
float roughnessToSpreadAngle(float roughness)
{
// FIXME: The mapping will most likely need adjustment...
return roughness * PI/8;
}
// #define USE_RAY_CONE_LOD
float computeBaseTextureLOD(float3 viewWS,
float3 normalWS,
float coneWidth,
float areaUV,
float areaWS)
{
// Compute LOD following the ray cone formulation in Ray Tracing Gems (20.3.4)
float lambda = 0.5 * log2(areaUV / areaWS);
lambda += log2(abs(coneWidth / dot(viewWS, normalWS)));
return lambda;
}
float computeTargetTextureLOD(Texture2D targetTexture, float baseLambda)
{
// Grab dimensions of the target texture
uint texWidth, texHeight;
targetTexture.GetDimensions(texWidth, texHeight);
return max(0.0, baseLambda + 0.5 * log2(texWidth * texHeight));
}
// The standard lit data used for paking intersection data for deferred lighting (for ray tracing)
struct StandardBSDFData
{
float3 baseColor;
float specularOcclusion;
float3 normalWS;
float perceptualRoughness;
float3 fresnel0;
float coatMask;
float3 emissiveAndBaked;
uint renderingLayers;
float4 shadowMasks;
uint isUnlit;
};
// This function compute the checkerboard undersampling position
uint ComputeCheckerBoardIndex(uint2 traceCoord, uint subPixelIndex)
{
uint localOffset = (traceCoord.x & 1 + traceCoord.y & 1) & 1;
uint checkerBoardLocation = (subPixelIndex + localOffset) & 0x3;
return checkerBoardLocation;
}
uint2 HalfResolutionIndexToOffset(uint index)
{
return uint2(index & 0x1, index / 2);
}
// This function defines what is the source pixel from where we should read the depth and normal for rendering in half resolution
uint2 ComputeSourceCoordinates(uint2 halfResCoord, uint subPixelIndex)
{
// TODO, there remains spots where the half res checker board pattern is still broken, there needs to be a pass done on it
uint checkerBoardIndex = ComputeCheckerBoardIndex(halfResCoord, subPixelIndex);
return halfResCoord * 2; //+ HalfResolutionIndexToOffset(checkerBoardIndex);
}
// These need to be negative for RayDistanceIndicatesHitSkyOrUnlit
#define RAY_TRACING_DISTANCE_FLAG_SKY 0.0
bool RayTracingGBufferIsUnlit(float rayDistance)
{
return rayDistance < 0.0;
}
bool RayTracingGBufferIsSky(float rayDistance)
{
return rayDistance == RAY_TRACING_DISTANCE_FLAG_SKY;
}
bool RayTracingGBufferIsLit(float rayDistance)
{
return rayDistance > 0.0;
}
float3 RayTracingHSVClamp(float3 color, float clampValue)
{
// Convert to HSV space
float3 hsvColor = RgbToHsv(color);
// Expose and clamp the final color
hsvColor.z = clamp(hsvColor.z, 0.0, clampValue);
// Convert back to HSV space
return HsvToRgb(hsvColor);
}
#endif // RAY_TRACING_COMMON_HLSL