본문 바로가기

Unreal Engine

Part 6 : 새로운 셰이딩 모델을 추가하기 (Adding a new Shading Model)

  • 코드를 수정하기 전, 앞장의 셰이더 컴파일 시간을 단축하는 설정을 반드시 참고할 것. 시간을 절약할 수 있음..
  • 새로운 셰이딩 모델을 추가하기 위해 수정해야 하는 부분들에는 크게 세 가지 부분이 있음 :
    • 머터리얼 에디터
    • 머터리얼 자체
    • 그리고 셰이더 코드

 

이 부분은 HLSLMaterialTranslator.h 에서 아래 부분으로 바뀐 것 같음 :

 

HLSLMaterialTranslator.h 의 일부
이 부분은 ShadingCommon.ush 에 있음
왼쪽 : BasicWall 머터리얼을 STYLIZED_SHADOW 셰이딩 모델로 바꾼 것, 오른쪽 : 기본 BasicWall 머터리얼
ShadingModelID 도 제대로 적용된 모습

#if MATERIAL_SHADINGMODELID_STYLIZEDSHADOW { else if (ShadingModel == SHADINGMODELID_STYLIZEDSHADOW) { GBuffer.CustomData.x = GetMaterialCustomData0(MaterialParameters); // GetMaterialCustomData0() 함수가 머터리얼에서 입력된 CustomData0 값을 가져온다. } } #endif

#if MATERIAL_SHADINGMODELID_STYLIZEDSHADOW
{
	else if (ShadingModel == SHADINGMODELID_STYLIZEDSHADOW)
	{
	GBuffer.CustomData.x = GetMaterialCustomData0(MaterialParameters);
	// GetMaterialCustomData0() 함수가 머터리얼에서 입력된 CustomData0 값을 가져온다.
	}
}
#endif

 

LightColor * (NoL * SurfaceAttenuation)

- 언리얼은 위와 같은 식으로 최종 라이팅 multiplier를 결정

 

 

float3 AttenuationColor = 0.f;
BRANCH
if(ShadingModelID == SHADINGMODELID_STYLIZED_SHADOW)
{
	float Range = GBuffer.CustomData.x * 0.5f;
	AttenuationColor = LightColor * ((DistanceAttenuation * LightRadiusMask * SpotFalloff) * smoothstep(0.5f — Range, 0.5f + Range, SurfaceShadow) * 0.1f);
}

else
{
	AttenuationColor = LightColor * (NoL * SurfaceAttenuation);
}

 

이런식으로 Attenuation을 반영함. 지금 언리얼 버전에서는 각 BxDF 에서 이 계산을 해줘야한다고 함

 

위 부분에 SHADINGMDELID_STYLIZEDSHADOW 부분을 추가하면 됨