光照模型定义
EngineTypes.h里,不同光照模型定义:
UENUM()
enum EMaterialShadingModel
{
MSM_Unlit UMETA(DisplayName="Unlit"),
MSM_DefaultLit UMETA(DisplayName="Default Lit"),
MSM_Subsurface UMETA(DisplayName="Subsurface"),
MSM_PreintegratedSkin UMETA(DisplayName="Preintegrated Skin"),
MSM_ClearCoat UMETA(DisplayName="Clear Coat"),
MSM_SubsurfaceProfile UMETA(DisplayName="Subsurface Profile"),
MSM_TwoSidedFoliage UMETA(DisplayName="Two Sided Foliage"),
MSM_Hair UMETA(DisplayName="Hair"),
MSM_Cloth UMETA(DisplayName="Cloth"),
MSM_Eye UMETA(DisplayName="Eye"),
MSM_UnlitShadow UMETA(DisplayName = "UnlitShadow"),
MSM_MAX,
};
搜索模型类型,可以看到材质编辑器中,某种模型类型下哪些材质上节点可见,哪些不可见。
每个光照模型对应的光照函数
每个光照模型有对应的光照函数:比如SHADINGMODELID_HAIR模型对应的是ShadingModels.ush里的HairBxDF函数:
FDirectLighting HairBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, float NoL, FAreaLight AreaLight, FShadowTerms Shadow )
{
FDirectLighting Lighting;
Lighting.Diffuse = 0;
Lighting.Specular = 0;
Lighting.Transmission = AreaLight.FalloffColor * Falloff * HairShading( GBuffer, L, V, N, Shadow.TransmissionShadow, 1, 0, uint2(0,0) );
return Lighting;
}
HairBxDF在IntegrateBxDF中被调用:
IntegrateBxDF:根据光照模型类型返回对应的光照函数
FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, float NoL, FAreaLight AreaLight, FShadowTerms Shadow )
{
switch( GBuffer.ShadingModelID )
{
case SHADINGMODELID_DEFAULT_LIT:
return DefaultLitBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_SUBSURFACE:
return SubsurfaceBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_PREINTEGRATED_SKIN:
return PreintegratedSkinBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_CLEAR_COAT:
return ClearCoatBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_SUBSURFACE_PROFILE:
return SubsurfaceProfileBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_TWOSIDED_FOLIAGE:
return TwoSidedBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_HAIR:
return HairBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_CLOTH:
return ClothBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
case SHADINGMODELID_EYE:
return EyeBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
default:
return (FDirectLighting)0;
}
}
IntegrateBxDF函数的调用
IntegrateBxDF函数在CapsuleLightIntegrate.ush,DeferredLightingCommon.ush和RectLightIntegrate.ush,ShadingModels.ush里都有。
几个该函数名的地方:
CapsuleLightIntegrate.ush(34):FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, FCapsuleLight Capsule, FShadowTerms Shadow, bool bInverseSquared )
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\CapsuleLightIntegrate.ush(101): return IntegrateBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\CapsuleLightIntegrate.ush(104):FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, FCapsuleLight Capsule, FShadowTerms Shadow, uint2 SVPos )
上面,capsuleLight里6个参数的函数最终返回AreaLight里的该函数,另外还有一个重载函数。
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\DeferredLightingCommon.ush(325): Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow, SVPos );
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\DeferredLightingCommon.ush(327): Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow );
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\DeferredLightingCommon.ush(335): Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, SVPos );
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\DeferredLightingCommon.ush(337): Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, LightData.bInverseSquared );
如上,DeferredLightingCommon里会调用RectLight或CapsuleLight的该函数。
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\RectLightIntegrate.ush(108):FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, FRect Rect, FShadowTerms Shadow )
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\RectLightIntegrate.ush(283): return IntegrateBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow );
上面8个参数的函数是ShadingModels.ush里的。
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\RectLightIntegrate.ush(286):FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, FRect Rect, FShadowTerms Shadow, uint2 SVPos )
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\ShadingModels.ush(910):FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, float NoL, FAreaLight AreaLight, FShadowTerms Shadow )
D:\UnrealEngine-release\UnrealEngine-release\Engine\Shaders\Private\ShadingModels.ush(947): return IntegrateBxDF( GBuffer, N, V, L, 1, NoL, AreaLight, Shadow );
上面可以看出,RectLightIntegrate里面也有几个重载函数,有的还依赖ShadingModels里的该函数。
下面是依赖关系:
EvaluateBxDF函数及其调用
EvaluateBxDF函数参数都是Light相关属性,通过这些属性创建FAreaLight类型,然后传递给IntegrateBxDF函数,计算光照。
别的shader里都是其他同名的IntegrateBxDF函数调用,ShadingModels里的该函数是被EvaluateBxDF函数调用。ShadingModels.ush里,调用该函数的地方如下所示:
FDirectLighting EvaluateBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float NoL, FShadowTerms Shadow )
{
FAreaLight AreaLight;
AreaLight.SphereSinAlpha = 0;
AreaLight.SphereSinAlphaSoft = 0;
AreaLight.LineCosSubtended = 1;
AreaLight.FalloffColor = 1;
AreaLight.Rect = (FRect)0;
AreaLight.bIsRect = false;
return IntegrateBxDF( GBuffer, N, V, L, 1, NoL, AreaLight, Shadow );
}
EvaluateBxDF在下面几个文件可以找到: