Custom Expression 에서 #include "활용"
이 기사를 읽기 전에...
이 기사를 읽다 보면 #include "/Project/Shaders/xxx.ush 등이 언급 되곤 합니다.
이것은 아래 엮인 기사를 참조 하여 프로젝트 루트 아래 Shaders 라는 사용자 정의 디렉토리를 사용하는 환경이기 때문입니다. ( 필자의 경우... 따로 플러그인을 만들었음... )
계속...
언리얼 머트리얼 에디터를 사용하다 보면 복잡한 머트리얼을 제작 할 때 정말 수 없이 많은 노드들의 축제가 시작 되곤 합니다. 암튼 그래서 개인적으로도 ... Custom Expression 을 사용해서 서브펑션을 만들어 사용하는 쪽을 선호 하는데요...
대략 이렇습니다.
큰 구조의 흐름은 이런 식으로 구성을 하고 있습니다.
아무튼... 언리얼 도큐먼트에도 딱히 Custom Expression 에서 usf 에 #include "" 로 빌트인 ush 가 아닌 custom ush 에 구조체를 사용하지 않은 상태로 다중 함수 블럭을 만들고 호출 하고 함수를 제활용 할 수 있는 방법은 잘 설명 되어 있지 않았기 때문에 간단히 기사를 통해 활용하는 방법을 정리 해 보려고 했습니다.
먼저 언리얼 빌트인 셰이더 중에서 GammaCorrection.ush 의 내용을 복사 해서 프로젝트에 지정 해 놓은 Shaders 디렉토리에 카피 해 보죠.
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
half3 LinearTo709Branchless(half3 lin)
{
lin = max(6.10352e-5, lin); // minimum positive non-denormal (fixes black problem on DX11 AMD and NV)
return min(lin * 4.5, pow(max(lin, 0.018), 0.45) * 1.099 - 0.099);
}
...
half3 sRGBToLinear( half3 Color )
{
Color = max(6.10352e-5, Color); // minimum positive non-denormal (fixes black problem on DX11 AMD and NV)
return select(Color > 0.04045, pow( Color * (1.0 / 1.055) + 0.0521327, 2.4 ), Color * (1.0 / 12.92));
}
....
//
// Sony S-Log3
//
float3
SLog3ToLinear(float3 Value)
{
return select((Value >= 171.2102946929f / 1023.0f), (pow(10.0f, (Value * 1023.0f - 420.f) / 261.5f)) * 0.19f - 0.01f, (Value * 1023.0f - 95.0f) * 0.01125000f / (171.2102946929f - 95.0f));
}
이제 에디터 상에서 커스텀 익스프레션을 사용해서 뭔가 해 보겠습니다.
이 셰이더 구문 자체를 사용해도 되는지 확인 해 봐야겠죠.
테스트를 위해서 Utility.ush 를 사용할 거에요.
Utility.ush 에서는 RGB 컬러를 입력 받아서 GammaCorrectionCommon.ush의 특정 함수를 사용한 후 출력 해 보겠습니다.
간단한 시각적 변화를 통해 정상적으로 처리 되고 있는지 확인 할 겸 하여 half3 sRGBToLinear( half3 Color ) 함수를 사용해 봅시다.
위의 형식처럼 간단히 테스트를 위해 구현 해 봤습니다.
결과를 보면 이렇게 애러 메시지가 뜹니다.
그럼 다시...
언리얼 엔진 5.0 기준으로 Custom 에는 Include 지정 프로퍼티가 존재 합니다.
가상 경로를 사용하여 include 의 모든 다중 함수를 쉽게 사용할 수 있도록 설계 되어 있죠.
#pragma once
#include "/Engine/Public/Platform.ush"
#include "/Project/Shaders/GammaCorrectionCommon.ush"
float3 output;
inputRGB;
output = sRGBToLinear( inputRGB );
return output;
위와 같은 테스트 코드를 사용하면 아래와 같은 애러가 발생 하게 되는데요...
테스트를 위해 GammaCorrection.ush 는 빌트인 셰이더 함수에서 그대로 복사 해 왔기 때문입니다.
Include File Paths 에서 정의 된 파일 경로에서 셰이더 함수부를 읽어서 다시 hlsl 코드가 작성 될 때 빌트인 원본 함수와 이름이 같은 함수에 대하여 중복 정의 되었다는 애러가 뜨는 겁니다.
이 결과를 비러 알수 있는 것은 Include File Paths 에서 포함 해야 할 헤더 형식의 셰이더 파일을 정확히 처리 하고 코드를 생성 해 주고 있다는 것을 확인 할 수 있죠.
그럼 테스트를 위해서...
이 구현부를 ...
라고 고쳐주고...
아까 복사해서 프로젝트에 가져온 GammaCorrection.ush 에 아래 코드 형식으로 추가 했습니다.
half3 sRGBToLinearMyTest( half3 Color )
{
Color = max(6.10352e-5, Color); // minimum positive non-denormal (fixes black problem on DX11 AMD and NV)
return select(Color > 0.04045, pow( Color * (1.0 / 1.055) + 0.0521327, 2.4 ), Color * (1.0 / 12.92));
}
결과 프리뷰 확인하기.
Recap
당연히 위와 같이 빌트인 함수를 복사 해서 사용하는 일은 거의 없기 때문이라는 점.
#iclude "" 를 코드에 추가 했다면 꼭 include File Paths 에서 동일하게 정의 해 줘야 정상 동작 한다.