TECHARTNOMAD TECHARTFLOW.IO

UNREAL ENGINE

Custom Expression 에서 #include "활용"

jplee 2023. 10. 26. 23:03

이 기사를 읽기 전에...

이 기사를 읽다 보면 #include "/Project/Shaders/xxx.ush 등이 언급 되곤 합니다.

이것은 아래 엮인 기사를 참조 하여 프로젝트 루트 아래 Shaders 라는 사용자 정의 디렉토리를 사용하는 환경이기 때문입니다. ( 필자의 경우... 따로 플러그인을 만들었음... )

 

 

[번역][기초]커스텀 익스프레션 프로젝트 경로 사용하기.

역자의 말. 경험상 노드 기반의 머트리얼이 노드 자체가 가독성도 너무 떨어지고 데이터 플로우 트레이스 하기에도 딱히 좋지도 않고(개인적으로...) 말이죠. 너무 복잡한 스파게티 노드는 함수

techartnomad.tistory.com

 

계속...


 

언리얼 머트리얼 에디터를 사용하다 보면 복잡한 머트리얼을 제작 할 때 정말 수 없이 많은 노드들의 축제가 시작 되곤 합니다. 암튼 그래서 개인적으로도 ... 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 에서 동일하게 정의 해 줘야 정상 동작 한다.