2021-09-09 20:42:29 -04:00

87 lines
3.6 KiB
HLSL

float3 SampleSpecularBRDF(BSDFData bsdfData, float2 theSample, float3 viewWS)
{
float roughness = bsdfData.roughnessAT;
float3x3 localToWorld;
if (HasFlag(bsdfData.materialFeatures, MATERIALFEATUREFLAGS_STACK_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);
float3 reflectanceFactor = (float3)0.0;
if (IsVLayeredEnabled(bsdfData))
{
reflectanceFactor = preLightData.specularFGD[COAT_LOBE_IDX];
reflectanceFactor *= preLightData.hemiSpecularOcclusion[COAT_LOBE_IDX];
// TODOENERGY: If vlayered, should be done in ComputeAdding with FGD formulation for non dirac lights.
// Incorrect, but for now:
reflectanceFactor *= preLightData.energyCompensationFactor[COAT_LOBE_IDX];
}
else
{
for(int i = 0; i < TOTAL_NB_LOBES; i++)
{
float3 lobeFactor = preLightData.specularFGD[i]; // note: includes the lobeMix factor, see PreLightData.
lobeFactor *= preLightData.hemiSpecularOcclusion[i];
// TODOENERGY: If vlayered, should be done in ComputeAdding with FGD formulation for non dirac lights.
// Incorrect, but for now:
lobeFactor *= preLightData.energyCompensationFactor[i];
reflectanceFactor += lobeFactor;
}
}
lighting.specularReflected = reflection.rgb * reflectanceFactor;
return lighting;
}
IndirectLighting EvaluateBSDF_RaytracedRefraction(LightLoopContext lightLoopContext,
PreLightData preLightData,
float3 transmittedColor)
{
IndirectLighting lighting;
ZERO_INITIALIZE(IndirectLighting, lighting);
return lighting;
}
float RecursiveRenderingReflectionPerceptualSmoothness(BSDFData bsdfData)
{
return PerceptualRoughnessToPerceptualSmoothness(bsdfData.perceptualRoughnessB);
}
#endif
#if (SHADERPASS == SHADERPASS_RAYTRACING_GBUFFER)
void FitToStandardLit( SurfaceData surfaceData
, BuiltinData builtinData
, uint2 positionSS
, out StandardBSDFData outStandardlit)
{
outStandardlit.baseColor = surfaceData.baseColor;
outStandardlit.specularOcclusion = surfaceData.specularOcclusionCustomInput;
outStandardlit.normalWS = surfaceData.normalWS;
outStandardlit.perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothnessA);
outStandardlit.fresnel0 = HasFlag(surfaceData.materialFeatures, MATERIALFEATUREFLAGS_STACK_LIT_SPECULAR_COLOR) ? surfaceData.specularColor : ComputeFresnel0(surfaceData.baseColor, surfaceData.metallic, IorToFresnel0(surfaceData.dielectricIor));
outStandardlit.coatMask = surfaceData.coatMask;
outStandardlit.emissiveAndBaked = builtinData.bakeDiffuseLighting * surfaceData.ambientOcclusion + builtinData.emissiveColor;
outStandardlit.isUnlit = 0;
}
#endif