Files
AR-Menu/Library/PackageCache/org.khronos.unitygltf@6b55d14e19c1/Runtime/Shaders/ShaderGraph/PBRHelpers.cginc
2025-11-30 08:35:03 +02:00

159 lines
5.3 KiB
HLSL

#ifndef UNITY_DECLARE_OPAQUE_TEXTURE_INCLUDED_2
#define UNITY_DECLARE_OPAQUE_TEXTURE_INCLUDED_2
#ifdef SHADERGRAPH_PREVIEW
void SampleSceneColor2_float(float2 uv, float lod, out float3 color)
{
color = float3(1,1,1);
}
void SampleSceneColor2_half(half2 uv, half lod, out half3 color)
{
color = half3(1,1,1);
}
#else
// Needed to comment this out due to IN-4055 - can't build with this include being present here
// For code changes, comment this out so autocomplete etc. work, but remember to comment it again
// #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// TODO figure out how we can differentiate between BiRP/URP/HDRP here
#define USE_CAMERA_OPAQUE
#if defined(USE_CAMERA_OPAQUE)
float4 _CameraOpaqueTexture_TexelSize;
// float _CameraOpaqueSampling_BlurShift;
TEXTURE2D_X(_CameraOpaqueTexture);
SAMPLER(sampler_CameraOpaqueTexture);
#endif
// for future use
// float applyIorToRoughness( const in float roughness, const in float ior ) {
// // Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and
// // an IOR of 1.5 results in the default amount of microfacet refraction.
// return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );
// }
/*
float3 Sample4Tap(float2 uv, float lod)
{
// bilinear GPU filtering doesn't look good enough;
// here we're doing 4 taps and blending them.
float3 c0 = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv), lod).rgb;
float3 c1 = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv + float2(_CameraOpaqueTexture_TexelSize.x * _CameraOpaqueSampling_BlurShift, 0)), 0).rgb;
float3 c2 = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv + float2(0, _CameraOpaqueTexture_TexelSize.y * _CameraOpaqueSampling_BlurShift)), 0).rgb;
float3 c3 = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv + float2(-_CameraOpaqueTexture_TexelSize.x * _CameraOpaqueSampling_BlurShift, 0)), 0).rgb;
float3 c4 = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv + float2(0, -_CameraOpaqueTexture_TexelSize.y * _CameraOpaqueSampling_BlurShift)), 0).rgb;
return (c0 + c1 + c2 + c3 + c4) / 5.0;
}
*/
void SampleSceneColor_float(float2 uv, float lod, out float3 color)
{
#if !UNITY_UV_STARTS_AT_TOP
if (_CameraOpaqueTexture_TexelSize.y > 0)
uv.y = 1-uv.y;
#endif
#define REQUIRE_OPAQUE_TEXTURE // seems we need to define this ourselves? HDSceneColorNode does that as well
#if defined(USE_CAMERA_OPAQUE)
color = SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv), lod).rgb;
// color = Sample4Tap(uv, lod); // TODO higher quality refraction
#else
// For HDRP, from HDSceneColorNode
#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(_SURFACE_TYPE_TRANSPARENT) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT) && (SHADERPASS != SHADERPASS_PATH_TRACING) && (SHADERPASS != SHADERPASS_RAYTRACING_VISIBILITY) && (SHADERPASS != SHADERPASS_RAYTRACING_FORWARD)
color = SampleCameraColor(uv, lod) * 1.0; // GetInverseCurrentExposureMultiplier()
#else
color = float3(0.0, 0.0, 0.0);
#endif
#endif
}
void SampleSceneColor_half(float2 uv, float lod, out float3 color)
{
SampleSceneColor_float(uv, lod, color);
}
#endif
void Refract_float(float3 v, float3 n, float ior, out float3 refractionVector)
{
refractionVector = refract( - v, normalize( n ), 1 / ior );
}
void Refract_half(half3 v, half3 n, half ior, out half3 refractionVector)
{
refractionVector = refract( - v, normalize( n ), 1 / ior );
}
inline half3 bump3y (half3 x, half3 yoffset)
{
float3 y = 1 - x * x;
y = saturate(y-yoffset);
return y;
}
void Spectral_float(float wavelength, out half3 color)
{
// Based on GPU Gems
// Optimised by Alan Zucconi
// w: [400, 700]
// x: [0, 1]
half x = ((wavelength - 400.0)/ 300.0) % 1.0;
const float3 c1 = float3(3.54585104, 2.93225262, 2.41593945);
const float3 x1 = float3(0.69549072, 0.49228336, 0.27699880);
const float3 y1 = float3(0.02312639, 0.15225084, 0.52607955);
const float3 c2 = float3(3.90307140, 3.21182957, 3.96587128);
const float3 x2 = float3(0.11748627, 0.86755042, 0.66077860);
const float3 y2 = float3(0.84897130, 0.88445281, 0.73949448);
color =
bump3y(c1 * (x - x1), y1) +
bump3y(c2 * (x - x2), y2) ;
}
#endif
void WorkaroundTilingOffset_float(UnityTexture2D Tex, float4 LegacyST, out float4 TilingOffset, out UnityTexture2D OutTex)
{
#if UNITY_VERSION >= 202120
TilingOffset = Tex.scaleTranslate;
Tex.scaleTranslate = float4(1,1,0,0);
#else
TilingOffset = LegacyST;
#endif
OutTex = Tex;
}
void WorkaroundTilingOffset_half(UnityTexture2D Tex, half4 LegacyST, out half4 TilingOffset, out UnityTexture2D OutTex)
{
#if UNITY_VERSION >= 202120
TilingOffset = Tex.scaleTranslate;
Tex.scaleTranslate = half4(1,1,0,0);
#else
TilingOffset = LegacyST;
#endif
OutTex = Tex;
}
void AreNormalsEncodedInXYZ_half(out bool normalsInXYZ)
{
#if UNITY_NO_DXT5nm
normalsInXYZ = true;
#else
normalsInXYZ = false;
#endif
}
void AreNormalsEncodedInXYZ_float(out bool normalsInXYZ)
{
#if UNITY_NO_DXT5nm
normalsInXYZ = true;
#else
normalsInXYZ = false;
#endif
}