[UE5]Custom Shader : PART3_Adding shading models_2
시작하며
앞선 글에서는 커스텀 셰이딩 모델 추가를 위해 엔진 소스 코드를 수정했습니다. 셰이딩 모델을 선언하고 컴파일 환경을 설정하는 등의 작업이었죠. 셰이더 코드 쪽에는 머티리얼 핀을 통해 들어온 색상 값이나 메탈릭/러프니스/스페큘라 등의 재질 값들을 갖고 화면에 뿌려질 그림을 그려주는 등의 좀 더 실질적인 코드들이 들어있습니다. 파일 별로 편집을 한 후 컴파일을 수행하는 시간이 다 달라요. 그래서 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);
// [...]
}
}
결과
마치며
셰이딩 모델을 추가해 봤어요. 여기까진 세팅에 가까운 부분이고 앞으로는 어떤 느낌의 셰이더를 만들 것인지 그리고 그것을 위해 어떤 작업들이 추가로 필요한지 알아보겠습니다
참고
Learning Unreal Engine 4: Implement Cel-Shading w/ Outline Using Custom Shading Model in UE4.22 (1)
Create Your Own Shading Model
medium.com