2pass 쉐이더를 1pass로 처리하다가 생긴 문제점 by 김윤정

저번에  Hybrid  님이 지적해 주셔서 2pass로 만들었던 지난번 쉐이더를 1pass로 전환하는 작업을 오늘 해 봤습니다만.
현실적인 문제가 발생!!!

저번에도 이 문제가 발생했음에도 불구하고 에이 뭐야 안되잖아

라고 넘어가서 2pass 작업을 했던건데,
다시 작업을 해 보니까 무슨 문제였던지 정확해 지더군요 .

문제는 저기 천의 휘어지는 윗 부분이 마치 그림자라도 진 듯 검게 되는 현상이었습니다.
이건 아무리 봐도 뒷면이 앞면에 그려지는 현상이었죠.
이론상으로는 90도가 넘어가면 뒷면처리가 되고, 90도가 넘어가면 앞면에서는 보이지 않는게 당연합니다만,
Normal은 face 에 귀속된게 아니라 vertex에 귀속된지라 정확도를 믿을 수 없다는 것이었습니다.

즉 원칙적으로 오른쪽 그림의 좌측의 Normal이 이론적으로 정상적인 Normal이지만,
실제 작업할 때에는 그래픽디자이너들이 Scale을 사용하기도 하고, Vertex 직접 조정도 사용하기도 하고 , 각종 Max의 Modifier를 적용하다보면 이게 미묘하게 틀어져 오른쪽 그림의 오른쪽에 있는 Normal처러 될 수도 있다는 것입니다.
그러다보면 저렇게 바깥쪽으로 틀어져 있는 경우도 생기고, 가끔은 좌우정렬도 맞지 않습니다.


그래서 이렇게 되면, 면 자체는 시선과 90도가 되지 않았는데도 normal은 90도가 넘어가 버리는 현상이 발생되게 되고, 그래서 나타나는 현상의 위의 검은 줄 이미지입니다.



Normal을 재정렬해주는 기능이 있다면 그걸 적용하면 되겠습니다만 일단 못찾겠.. (...)
어쨌거나 그래서 1pass작업은 실패입니다.

좌측 그림이 위 이미지의 Normal 입니다. 확실히 넘어갈만 하네요 ...
 결론적으로, 깔끔하게  2pass를 쓰는게 확실하겠습니다.

그래픽 디자이너에게 이걸 다 맞춰달라고 하는건 확실히 무리!

작업하면서 일일히 Normal까지 신경쓰면서 만드는 것은 불가능 한데다가, 정렬도 간편하지 않습니다.
그러므로 2pass 처리를 하는 것이 가장 효율적이라는 결론을 내리게 되었습니다.



덧글

  • Hybrid 2010/02/08 19:42 #

    오옷~ practical 하게는 저런 문제가 생길 수 있군요.
    그런데 노말이야 원래 오차가 있긴 하지만, 앞면이 뒷면이 될정도로 심각하게 차이가 나는 경우도 있군요;;

    제 경우는 저장된 normal 을 사용하지 않고(예를 들어 3ds 포멧 같은 경우는 normal 이 저장되어 있지 않죠) 프로그램에서 모델을 읽어올 때 주변 vertex 정보를 통해 normal 을 계산하기 때문에 위와 같은 오차는 생긴적이 없었네요.

    그런데 저렇게 뒤집힌 노말은 꼭 이 렌더링이 아니라 다른 곳에서도 문제가 생길법 하긴 한데.. 지금은 딱히 생각나는건 없군요. 흐음~~
  • 김윤정 2010/02/08 20:37 #

    아하 역시 그런 방법이 ...! 저야 뭐 있는 노말 끌어다 쓰기도 벅차니까요 ㅎㅎ
    확실히 저도 그래픽 디자이너지만 작업할때 저걸 일일히 신경쓰고 작업하지는 못하지요 :)
    사실 지금처럼 부각되는 특이한 경우가 아니라면 어느 정도 오차는 그냥 눈속임으로 넘어갈 수도 있을거라고 생각되네요
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

<script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>