87 lines
3.8 KiB
HLSL
87 lines
3.8 KiB
HLSL
float3 SampleSpecularBRDF(BSDFData bsdfData, float2 theSample, float3 viewWS)
|
|
{
|
|
float roughness = PerceptualRoughnessToRoughness(bsdfData.perceptualRoughness);
|
|
float3x3 localToWorld;
|
|
if (HasFlag(bsdfData.materialFeatures, MATERIALFEATUREFLAGS_LIT_ANISOTROPY))
|
|
{
|
|
localToWorld = float3x3(bsdfData.tangentWS, bsdfData.bitangentWS, bsdfData.normalWS);
|
|
}
|
|
else
|
|
{
|
|
localToWorld = GetLocalFrame(bsdfData.normalWS);
|
|
}
|
|
float NdotL, NdotH, VdotH;
|
|
float3 sampleDir;
|
|
SampleGGXDir(theSample, viewWS, localToWorld, roughness, sampleDir, NdotL, NdotH, VdotH);
|
|
return sampleDir;
|
|
}
|
|
|
|
#ifdef HAS_LIGHTLOOP
|
|
IndirectLighting EvaluateBSDF_RaytracedReflection(LightLoopContext lightLoopContext,
|
|
BSDFData bsdfData,
|
|
PreLightData preLightData,
|
|
float3 reflection)
|
|
{
|
|
IndirectLighting lighting;
|
|
ZERO_INITIALIZE(IndirectLighting, lighting);
|
|
lighting.specularReflected = reflection.rgb * preLightData.specularFGD;
|
|
return lighting;
|
|
}
|
|
|
|
IndirectLighting EvaluateBSDF_RaytracedRefraction(LightLoopContext lightLoopContext,
|
|
PreLightData preLightData,
|
|
float3 transmittedColor)
|
|
{
|
|
IndirectLighting lighting;
|
|
ZERO_INITIALIZE(IndirectLighting, lighting);
|
|
|
|
#if HAS_REFRACTION
|
|
float3 preLD = transmittedColor;
|
|
|
|
// We use specularFGD as an approximation of the fresnel effect (that also handle smoothness)
|
|
float3 F = preLightData.specularFGD;
|
|
lighting.specularTransmitted = (1.0 - F) * preLD.rgb * preLightData.transparentTransmittance;
|
|
#endif
|
|
|
|
return lighting;
|
|
}
|
|
|
|
float RecursiveRenderingReflectionPerceptualSmoothness(BSDFData bsdfData)
|
|
{
|
|
return PerceptualRoughnessToPerceptualSmoothness(bsdfData.perceptualRoughness);
|
|
}
|
|
|
|
#if HAS_REFRACTION
|
|
void OverrideRefractionData(SurfaceData surfaceData, float refractionDistance, float3 refractionPositionWS, inout BSDFData bsdfData, inout PreLightData preLightData)
|
|
{
|
|
// This variable is only used for SSRefraction, we intentionally put an invalid value in it.
|
|
bsdfData.absorptionCoefficient = TransmittanceColorAtDistanceToAbsorption(surfaceData.transmittanceColor, refractionDistance);
|
|
preLightData.transparentRefractV = 0.0;
|
|
preLightData.transparentPositionWS = refractionPositionWS;
|
|
preLightData.transparentTransmittance = exp(-bsdfData.absorptionCoefficient * refractionDistance);
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_RAYTRACING_GBUFFER)
|
|
void FitToStandardLit( SurfaceData surfaceData
|
|
, BuiltinData builtinData
|
|
, uint2 positionSS
|
|
, out StandardBSDFData outStandardlit)
|
|
{
|
|
outStandardlit.specularOcclusion = surfaceData.specularOcclusion;
|
|
outStandardlit.normalWS = surfaceData.normalWS;
|
|
|
|
float metallic = HasFlag(surfaceData.materialFeatures, MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR | MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING | MATERIALFEATUREFLAGS_LIT_TRANSMISSION) ? 0.0 : surfaceData.metallic;
|
|
|
|
outStandardlit.baseColor = ComputeDiffuseColor(surfaceData.baseColor, metallic);
|
|
outStandardlit.fresnel0 = HasFlag(surfaceData.materialFeatures, MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR) ? surfaceData.specularColor : ComputeFresnel0(surfaceData.baseColor, surfaceData.metallic, DEFAULT_SPECULAR_VALUE);
|
|
|
|
outStandardlit.perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness);
|
|
outStandardlit.coatMask = HasFlag(surfaceData.materialFeatures, MATERIALFEATUREFLAGS_LIT_CLEAR_COAT) ? surfaceData.coatMask : 0.0;
|
|
outStandardlit.emissiveAndBaked = builtinData.bakeDiffuseLighting * surfaceData.ambientOcclusion + builtinData.emissiveColor;
|
|
outStandardlit.isUnlit = 0;
|
|
}
|
|
#endif
|