UE5

[UE5]Custom Shader : PART3_Adding shading models_2

kaynine 2023. 9. 27. 10:49

시작하며

앞선 글에서는 커스텀 셰이딩 모델 추가를 위해 엔진 소스 코드를 수정했습니다. 셰이딩 모델을 선언하고 컴파일 환경을 설정하는 등의 작업이었죠. 셰이더 코드 쪽에는 머티리얼 핀을 통해 들어온 색상 값이나 메탈릭/러프니스/스페큘라 등의 재질 값들을 갖고 화면에 뿌려질 그림을 그려주는 등의 좀 더 실질적인 코드들이 들어있습니다. 파일 별로 편집을 한 후 컴파일을 수행하는 시간이 다 달라요. 그래서 ShadingModels.ush같이 오랜 시간 컴파일하는 코드를 수정할 경우는 가급적 미리 어떤 식으로 보여질 지 계획을 잘 세우고 접근하는 것이 좋아요.

 

셰이더 코드는 C++로 작성돼 있는 엔진 코드와는 다르게 비주얼 스튜디오에서 인텔리센스를 지원하지 않아요. 플러그인을 사용하거나 익스텐션을 이용해야 하죠. 하지만 익스텐션은 어느 순간 메모리를 엄청나게 차지하게 되니 시스템 자원을 잘 봐가면서 써야 해요. VS Code를 사용하는 것도 괜찮은 방법이라고 생각해요.


셰이더 코드 수정하기

Definitions.usf

렌더링 옵션 플래그를 선언해 줍니다

// [...]

// [ CUSTOM ] Adding custom shading model
#ifndef MATERIAL_SHADINGMODEL_CUSTOM_LIT
#define MATERIAL_SHADINGMODEL_CUSTOM_LIT				0
#endif

// [...]

ShadingCommon.ush

커스텀 셰이딩 모델을 선언하고 디버깅 색상을 설정합니다

// [...]

// [ CUSTOM ] Adding custom shading model
#define SHADINGMODELID_CUSTOM_LIT			12

// [...]

float3 GetShadingModelColor(uint ShadingModelID)
{
#if PS4_PROFILE

	// [...]

#else
	switch(ShadingModelID)
	{
		// [...]
		
		// [ CUSTOM ] Adding custom shading model - Debugging color
		case SHADINGMODELID_CUSTOM_LIT: return float3(0.0f, 1.0f, 1.0f);
	
		// [...]
	}
#endif
}

BasePassPixelShader.usf

이 파일은 렌더링 초반에 중요한 작업을 해요. 차후에 더 알아보기로 하고 당장은 반투명 재질의 볼륨 라이팅 모드가 커스텀 셰이딩 모델에도 적용되도록 설정해 주는 정도만 합니다

// [ CUSTOM ] Adding custom shading model
// Volume lighting for lit translucency	
#if (MATERIAL_SHADINGMODEL_DEFAULT_LIT || MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_MABINOGI_LIT) && (MATERIALBLENDING_TRANSLUCENT || MATERIALBLENDING_ADDITIVE) && !FORWARD_SHADING
if (GBuffer.ShadingModelID == SHADINGMODELID_DEFAULT_LIT || GBuffer.ShadingModelID == SHADINGMODELID_SUBSURFACE || GBuffer.ShadingModelID == SHADINGMODELID_CUSTOM_LIT)
{
	Color += GetTranslucencyVolumeLighting(MaterialParameters, PixelMaterialInputs, BasePassInterpolants, GBuffer, IndirectIrradiance);
}
#endif

ShadingModels.ush

CustomBxDF라고 명명한 함수에서 셰이딩 모델의 수식을 작성해 줍니다. DefaultLitBxDF 함수를 참고하세요

// [ CUSTOM ] Adding custom shading model
FDirectLighting CustomBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, half NoL, FAreaLight AreaLight, FShadowTerms Shadow )
{
	// [...]
}

FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, half NoL, FAreaLight AreaLight, FShadowTerms Shadow )
{
	switch( GBuffer.ShadingModelID )
	{
		// [...]
		
		// [ CUSTOM ] Adding custom shading model
		case SHADINGMODELID_CUSTOM_LIT:
			return CustomBxDF(GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow);
		
		// [...]
	}
}

결과

왼쪽은 DefaultLit 오른쪽은 CustomLit 이에요


마치며

셰이딩 모델을 추가해 봤어요. 여기까진 세팅에 가까운 부분이고 앞으로는 어떤 느낌의 셰이더를 만들 것인지 그리고 그것을 위해 어떤 작업들이 추가로 필요한지 알아보겠습니다


참고

https://medium.com/@solaslin/learning-unreal-engine-4-implement-cel-shading-w-outline-using-custom-shading-model-in-ue4-22-1-775bccdb9ffb

 

Learning Unreal Engine 4: Implement Cel-Shading w/ Outline Using Custom Shading Model in UE4.22 (1)

Create Your Own Shading Model

medium.com