본문 바로가기
Shader

유니티 셰이더 그래프(Unity shadergraph) 이해할 수 없는 셰이더 그래프의 뒤통수

by 대마왕J 2020. 1. 1.

블로그 주인장에게 커피값을 후원할 수 있습니다! 

donaricano-btn

서론

 

아니 진짜 셰이더 그래프는 정말정말정말정말 * 10 마음에 안드는 구석이 한두군데가 아닌데요. 

예전의 스트럼피 셰이더 만든 사람이 그 철학 그대로 만들어서 정말정말정말정말 구립니다. 

 

익숙해진 사람한테는 그냥 욕하고 지나갈 정도지만, 처음 배우는 사람들 입장에서는 완전 함정에 가까울정도로 엉망입니다. 

 

한 두개가 아니지만 오늘 스터디하면서 가르쳐보니 진짜 경악을 금치 못했던 내용. 

심지어 제대로 가르쳤는데도 학생들이 제대로 이해를 못하던 사건입니다. 

(이해는 했는데 의도적으로 엉망으로 이해해야 하는 사건이랄까)

 

예를 들어보죠. 

 

 

Vector4  +  Vector4 입니다.[각주:1] 

 

이거야 뭐 

 

  0.5 0.5 0.5 0.5

+ 0.5 0.5 0.5 0.5

------------------

  1.0 1.0 1.0 1.0

 

이런 느낌인거죠 

문제 없어요. 마찬가지로 vector2+vector2 나 vector3+vector3도 문제 없습니다. vector1 + vector1은 두말할 필요 없고 

 

 

그런데 이렇게 하면 어떻게 될까요?

 

 

 

 

Vector3  +  Vector4 입니다. 

 

3자리 + 4자리라니요. [각주:2]

근데 노드로 하니까 잘 됩니다. 

이건 어떻게 된 걸까요?

 

 

  0.5 0.5 0.5 ???

+ 0.5 0.5 0.5 0.5

------------------

  1.0 1.0 1.0 ???

 

 

 

궁금합니다. 

 

아니 근데? 

 

뭔가 이상한게 보이네요???

 

 

 

출력이 Vector3야 ?!?!??!? 

 

그말인 즉슨, 작은 놈과 큰 놈을 더하면 , 큰 놈을 작은 놈에 맞춰준다는 얘기네요? 즉 이 경우는 마지막 자리를 잘라 버리네요???

쉽게 설명하면 아래처럼 말이죠???

 

  0.5 0.5 0.5

+ 0.5 0.5 0.5 0.5

------------------

  1.0 1.0 1.0

 

거 되게 마음에 안드네 

 

코딩으로 배운 사람 입장에서는 이게 뭔 그지같은 짓이야 라는 느낌이지만 음 그런가 보다 하겠습니다 

좋아요 세상은 변하는 거고, 나는 언제건 꼰대가 될 수 있는거니까요. 음 그래요. 이해하도록 노력해 보겠습니다. 내가 늙은이지.

 

 

 

 

 

 

 

 

 

 

이해할 수 없는 셰이더 그래프의 뒤통수 1 

 

좋아요. 뭐 지금까지만으로는 대충 이렇게 정의할 수 있겠네요. 

'같은 자리의 수 끼리는 잘 연산되고, 다른 자리의 수와 연산하면, 작은 자리의 수에 맞춰서 잘린다' [각주:3]

 

이런 개념은 논리적이어야 합니다. 특히 아티스트들에게 이런 장난감을 줄 때에는 더더욱 조심해야 하죠. 

셰이더는 그냥 막 다루는 녀석이 아닙니다. 잘못 다루면 퍼포먼스 측면에서도 위험해지기 때문에 잘 가르쳐야 해요. 

 

자 그럼 뭐 대충 알겠으니까. 이번엔 저 벡터3(플롯3) 를 블랙보드 (properties)로 빼봅시다. 

Vector3 를 뺐으니까 인터페이스에서도 Vector3가 나와 있겠지요?

 

 

 

 

 

 

 

하하하하하하하하하하하하하하하하하하하ㅏ핳하하하하하하하하하하하하하하하하하하하ㅏ핳

이름은 Vector3 인데 밖으로 빼보니 4자리야 하하ㅏ하하ㅏㅎ하하하하

 

하긴 프로퍼티스에 float3 인터페이스가 생길 수 있다는 말은 듣도보도 못했습니

다 

 

 

사실 Properties에는 Vector3 같은 인터페이스 자체가 없습니다. 그런데 억.지.로. 보여주려고 하다 보니까 어쩔 수 없이 Vector4를 써서 보여주는 거예요. 아아 그렇다면 결국 저런 경우에는 properties에서 Vector4 변수가 생성된 다음, Vector3에다가 밀어 넣어서 넘치는건 짤라 버리는 방식입니다. [각주:4]

아니 알겠는데... 이거 그럴바엔 Vector2나 Vector3는 그냥 properties에서 막아 놓으면 안되나요? 어차피 못만드는 거잖아요.. 

 

아티스트를 위한다는게 무조건 다 풀어준다는게 좋은건 아니거든요. 이런 경우엔 혼란이 일어나게 되어요. 

 

 

즉 원칙이 이렇게 변하게 됩니다. 

 

'같은 자리의 수 끼리는 잘 연산되고, 다른 자리의 수와 연산하면, 작은 자리의 수에 맞춰서 잘린다' ...인데

'그렇지만 이걸 인터페이스로 빼면 무조건 Vector4로 생성되고, 그게 다시 작은 자리의 수에 맞춰서 잘린다. 

내가 써놓고도 무슨 말인지 잘 모르겠네

 

자 뭐 .. 혼란스러워졌지만 세상은 어차피 혼란하니 그렇다 쳐 봅시다 

 

 

 

 

 

이해할 수 없는 셰이더 그래프의 뒤통수 2

 

 

그래요 뭐 이렇게 가르쳤다 칩시다. 아무것도 모르는 그래픽들한테요. 

 

 

'같은 자리의 수 끼리는 잘 연산되고, 다른 자리의 수와 연산하면, 작은 자리의 수에 맞춰서 잘린다' 

'그렇지만 이걸 인터페이스로 빼면 무조건 Vector4로 생성되고, 그게 다시 작은 자리의 수에 맞춰서 잘린다. 

 

 

그런데 이번엔 이렇게 함 해보죠. 

저 원칙을 가지고 말이죠.

 

Vector1 + Vector4를 해 봅시다 

 

 

 

 

출력이 Vector4 가 나왔습니다. 

 

 

아하하ㅏ하하ㅏ하하ㅏ하하하하ㅓㅏ아ㅓ허ㅏㄴ아ㅓㅁ하ㅏㅎ하하ㅏㅏ하하하하하하하하ㅏ하하ㅏ핳

저게 뭐야 하하하하하ㅏ하하하하ㅏ하ㅏ하ㅏ하하하하ㅏ하하

 

 

 

아니 지금까지의 원칙이라면 

 

'같은 자리의 수 끼리는 잘 연산되고, 다른 자리의 수와 연산하면, 작은 자리의 수에 맞춰서 잘린다' 

 

니까. 

 

 

Vector1 + Vextor4는 Vector1 이 나와야 하는 거잖아요????? 

코드로 해와서 왜 저렇게 되는지 당연한 사람은 이해하겠지만 , 노드로만 배웠다면 저걸 어떻게 받아들이란 거예요???? 

 

 

지금까지의 원칙은 

Vector2 + Vextor4는 Vector2

Vector3 + Vextor4는 Vector3

가 원칙이라고 가르쳐 놨는데 

 

Vector1 + Vextor4는 Vector4

라고요???? 이 무슨 원칙의 오류여???[각주:5]

 

 

그러므로 이런 뒤통수들을 다 인정해서 원칙을 쓰면 

아래와 같아 지겠네요 

 

 

'같은 자리의 수 끼리는 잘 연산되고, 다른 자리의 수와 연산하면, 작은 자리의 수에 맞춰서 잘린다' 

'그렇지만 이걸 인터페이스로 빼면 무조건 Vector4로 생성되고, 그게 다시 작은 자리의 수에 맞춰서 잘린다. 

'그렇지만 Vector1가 끼어서 연산할 때에는 큰 자리의 수에 맞춰서 늘어난다' 

 

 

으으.. 그냥 코딩으로 할 때에는 그냥 수학식하고 똑같으니까 굳이 이런거 생각할 필요도 없었는데 

노드로 하니까 엉망진창이 되네요 

 

노드 싫어요 진짜. 아니 엠플리파이드 만큼만 되어도 뭐라 안할래요. 이건 아님 진짜.

편하라고 만들어 놓은게 더 망치고 있는 느낌임

 

 

  1. 쉐이더에서는 뭐 늘 float4라고 해왔는데다가 그거나 그거나 같은 말이니까... [본문으로]
  2. 코딩으로 할 때에는 단박에 에러가 나는 연산입니다. [본문으로]
  3. 솔직히 말도 안된다고 생각하지만 일단 참고 가겠습니다. [본문으로]
  4. 실제 구현된 코드를 봐도 그렇습니다 [본문으로]
  5. 굳이 왜 그런지 이유를 안 알려주셔도 됩니다. 이유를 몰라서 이런 글을 쓰는게 아닌지라... [본문으로]
반응형

댓글