본문 바로가기
Shader

유니티 셰이더 그래프(Unity shadergraph) 칼라 덧셈과 곱셈의 이상한 결과물♥

by 대마왕J 2019. 12. 28.

어제 스터디하다가 이상한 결과 발견 



회색 더하기 회색이 흰색이 아냐?!?!


곱하기 (multiply) 는 잘 모르겠으니 그렇다 쳐도 

더하기(add) 의 결과물은 사뭇 놀랄 지경. 회색 (0.5) + 회색 (0.5) 가 흰색(1.0) 이 아니니까요. 

이거.. 전형적인 감마쪽 문제인데... 

설마.. 그냥 내부에서 색상 노드를 만들었는데 저걸 sRGB 영역인걸로 인식하는건가?!?!? 


그래서 이렇게 같은 내용을 수치로 만들어 봤더니 


 

... 흰색이 나옴 ... 


히이이익 야 이거 맞나본데?!??!


그래서 '아직 정식 문서화도 안된 깃허브 문서' 를 열어서 확인을 해봤더니[각주:1]


https://github.com/Unity-Technologies/ScriptableRenderPipeline/blob/master/com.unity.shadergraph/Documentation~/Color-Node.md#generated-code-example



아아아아아아아아악


감마스페이스일때는 그냥 float4 출력이고 

리니어 스페이스일때에는 sRGBtoLinear 함수를 RGB만 거치게 되어 있어 !!!![각주:2]



     


즉 이렇게 두 개가 다른 이유가, 칼라는 이미 sRGB 영역이라고 인식해서 리니어로 변환하니 어두워 진거고, 어두워 진걸 연산하니 결과까지도 어두워진거란 말씀...!!!! (이해가 안가는 분은 감마가 어디감마 참고하시길) 

https://chulin28ho.tistory.com/477



어쨌거나 이해가 안되는게, 인터널에서 칼라를 만들면 그걸 왜 sRGB로 인식하는 건가요?!?!? 그러니까 저렇게 나오지...


그래서 그럼 이 칼라가 sRGB 가 아니고 리니어로 인식하게 만들려면... 뭐 RGB에 0.45 제곱해주면 되겠지만 (감마 2.2 상태라면) 

혹시 노드로 구현되어 있지 않나 싶어 찾아봤더니


역시 Colorspace Conversion(칼라공간 변환) 노드가..!!!!




그래서 위 처럼 일단 칼라 공간 변환을 해 주고 (Linear -> RGB로 )  연산하니까 이제 알맞은 결과가 나왔네요! [각주:3]


즉 정리하면 색상을만든다 (sRGB-> 리니어 변환) 

그리고 그걸 다시 sRGB 변환을 해줘서 원래로 돌린다 (리니어 -> sRGB) 

그리고 그걸 연산한다는 아주 귀찮은 짓을 해줘야 한다는 것을 알게 되었습니다 끄응 ... 아니 이게 왜 ... 끄응... 



대충 이렇게 만든 이유를 유추해 보자면, 


이게 가능하니까 그러는 것 같은데 말이죠 


이렇게 블랙보드로 빼서 properties화 시켜 놓으면, 

아티스트가 이걸 다루는건 sRGB 개념으로 다룰 테니까 ... 라는 느낌적인 느낌인 것 같은데

아니 이걸 그렇다고 이렇게 할 필요가 있나?...??? 



  1. 아니 설마 color 노드가 뭐 별게 있을까 하고 문서를 일부러 보진 않았었죠. 역시 스터디를 해야 이런걸 볼 수 있다 짱이다 [본문으로]
  2. URP 부터는 기본이 리니어 스페이스. [본문으로]
  3. 설명 대충했지만 저 색상 공간은 RGB만 적용되므로 알파까지 살리려면 알파는 따로 빼내서 저 노드를 거치지 않고 그대로 출력해야 합니다. [본문으로]
반응형

댓글