시작하며
앞선 글에서는 커스텀 셰이딩 모델 추가를 위해 엔진 소스 코드를 수정했습니다. 셰이딩 모델을 선언하고 컴파일 환경을 설정하는 등의 작업이었죠. 셰이더 코드 쪽에는 머티리얼 핀을 통해 들어온 색상 값이나 메탈릭/러프니스/스페큘라 등의 재질 값들을 갖고 화면에 뿌려질 그림을 그려주는 등의 좀 더 실질적인 코드들이 들어있습니다. 파일 별로 편집을 한 후 컴파일을 수행하는 시간이 다 달라요. 그래서 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
'UE5' 카테고리의 다른 글
| [UE5]Custom Shader : PART5_Editing GBuffer (3) | 2023.10.26 |
|---|---|
| [UE5]Custom Shader : PART4_Custom Material Ouput (1) | 2023.10.16 |
| [UE5]Custom Shader : PART3_Using Custom Data (1) | 2023.10.10 |
| [UE5]Custom Shader : PART1_Adding shading models_1 (0) | 2023.09.19 |