셰이더 그래프 - Output 자료형

셰이더

목록 보기
3/3

서론

유니티에서 셰이더 그래프를 사용할 때 유니티가 제공하지 않는 노드들은 Custom Function이라는 것을 통해 새로운 노드를 제작할 수 있습니다.

Type - String

Type - File

이때, Type을 String으로 할 것인가? 또는 File로 할 것인가? 에 대한 선택을 할 수 있습니다.

필자는 일반적으로는 File 방식을 더 많이 선호합니다.
왜냐하면, Rider를 사용하거나 VS Code에 플러그인을 사용하면 셰이더를 자동완성 기능AI를 통해 빠르게 제작이 가능하기 때문입니다.

이 문서에서는 String방식을 언급하도록 하겠습니다.

본론

HLSL 셰이더에서도 다양한 자료형을 제공합니다.

그 중에서 유니티는 float과 half 자료형을 보편적으로 사용합니다.

이는,

Custom Function을 제작할 때 선택할 수 있습니다.

  • Inherit : 마스터 노드의 Precision에 따라갑니다. (마스터 노드가 half면 이 노드도 half입니다.)
  • Single(float) : 비트 수 32, 정밀도가 중요하거나 정확한 결과가 필요한 경우
  • Half : 비트 수 16, 성능이 중요하거나 큰 데이터 세트를 저장하는 경우
  • UseGraphPrecision : 필자도 모르겠음, Inherit과 비슷한듯…

만약 여러분들이 Precision을 Single 또는 Half로 정확하게 지정하여 Custom Function을 알맞게 float 또는 half로 출력한다고 했을 때 이슈는 없습니다.

지금부터 문제는 Inherit모드를 사용하는 상태에서 Out 자료형을 알맞게 처리하는 것을 알아볼 것입니다.

틀린 문제

위 상황은 Precision이 Inherit모드(마스터 노드 : Single)인 상태에서 Out 자료형을 half3를 사용하고 있는 상황입니다.

이렇게 하면 셰이더 컴파일 시 GetVector3함수는 Return 자료형이 float임에도 불구하고 half를 작성하여 Casting을 요구하고 있는 상황이 되어버립니다.

위와 같이 셰이더 함수가 생성됨.

해결 방안

$precision 을 사용하자

$precision은 Inherit모드가 Single인가? Half인가?에 따라 자동으로 $Precision을 해당 자료형으로 변경해주는 녀석입니다.

마스터 노드의 Precision을 Half로 한 상태에서,

위와 같이 float 또는 half가 작성되어야 하는 곳에 $precision을 작성하였습니다.

그런 다음 셰이더 코드 Generate를 통해 확인해보면, $precision이 알맞게 half로 변경되어 있는 것을 확인 할 수 있겠습니다.

결론

Custom Function을 제작할 때 Type을 String으로 작업한다면 $precision을 사용하자.

Tip.

File 모드에서는 $precision 사용 불가

후원

이 내용이 맛있었다면 저에게 맛있는 커피를 후원해주세요! ☕

토스 익명 송금 : 후원하기
계좌 송금 : 토스뱅크 1000-0586-4766 (김한용)

profile
유니티를 통한 스페셜 테크닉만 다루는 독특한 개발자

0개의 댓글