ue4不同光照模型

EngineTypes.h里,不同光照模型定义:UENUM()enum EMaterialShadingModel{ MSM_Unlit UMETA(DisplayName="Unlit"), MSM_DefaultLit UMETA(DisplayName="Default Lit"), MSM_Subsurface UMETA(DisplayName=&
摘要由CSDN通过智能技术生成

光照模型定义

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在下面几个文件可以找到:

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值