본문 바로가기
자료는 자료지/회사 내부용 자료

모바일 프로젝트에서의 조명 Blinking 현상에 대한 연구

by 대마왕J 2012. 4. 19.

이제야 모바일 프로젝트로 들어와서 죄송;;; 다른 일들이 밀려서 이제야 들어왔네요

 

이전부터 문제로 보고되던 것이 있었습니다. 그것은 에디터에서는 정상인 오브젝트들이, 모바일 기기로 넣었을때에만 이상한 Blinking (깜빡임) 현상이 일어난다는 것이었습니다.

이 현상은 Directional Light가 있을때 나타났으며, 카메라를 돌리면 주로 나타났지만, 카메라를 돌리지 않고 오브젝트의 거리가 좀 멀어진다던가 해도 일어났었습니다. 또한 모든 오브젝트에 일어나는 현상은 아니었으며, 특정한 오브젝트에만 일어났었습니다.

 

각도따라서 빛의 밝기가 변합니다. 색이 강조되는 아몰레드 액정에서는 더 과장되게 반짝입니다.

 

근 3일동안 원인을 찾느라고 별 짓을 다 했습니다만...
핸드폰 기종도 바꿔보고 조명 옵션도 픽셀라이트와 버텍스 라이트로 바꿔보고, 폴리곤을 늘려도 보고 노말도 짤라 보고... 별 짓을 다 해봤습니다만 답이 안나오다가 , 발견했습니다.

그건 바로 Scale 문제였더군요.

3D 그래픽스에서, 스케일은 종종 위험한 물건으로 취급됩니다. scale은 vertex 위치만 변할 뿐, normal 등의 데이터는 변환이 안되는 경우가 많거든요. 이전엔진인 겜브리오에서는 그래서 반드시 엔진으로 넘기기 전에 Reset Xform 을 하고 넘겨야 하는 규칙이 있었습니다.

그렇지만 Unity로 넘어오게 되면서, 이런 귀찮은 것들을 엔진에서 전부 알아서 해줘 버리는 덕분에 거의 신경 안쓰고 작업을 할 수 있었습니다.

그치만 그건 웹이나 스텐드 얼론 만들 때 얘기고... 모바일에서는 여전히 이 Scale이 문제를 일으킨다는 것을 발견했습니다.

  

 

에디터 화면입니다. 위쪽의 파란 오브젝트는 scale을 하지 않은 오브젝트의 normal 값이고, 아래쪽의 녹색 같은 오브젝트는 scale이 된 오브젝트입니다.

오른쪽 화면에서처럼 약간 각도를 바꾸니, normal 값이 전체적으로 어두워지는 것을 볼 수 있습니다. 이렇게 에디터에서도 이상증상이 확인되었습니다.

텍스쳐와 라이트를 적용하면 이런 모양이 되겠습니다.

위의 오브젝트는 문제가 없으며, 아래쪽 오브젝트는 문제가 생깁니다.

 

 

즉 Scale이 적용되지 않는 오브젝트는  light 문제가 일어나지 않는다는 것이며, 이 문제를 해결하기 위해서는

1. 적용되는 모든 오브젝트에 Reset Xform을 적용하여야 하며

2. 적용된 오브젝트의 재사용을 위해 Scale을 사용하지 말아야 한다

는 전제가 필요합니다.

이미 들어간 오브젝트의 normal값을 프로그램적으로 재정렬시켜 빛 계산을 다시 하는 방법도 고려해 보았지만, 그렇게 하면 재사용의 의미가 없어지게 되므로 포기했습니다.

그렇지만 우리 프로젝트는 이미 scale을 많이 사용하고 있지요. 이미 web 버전에서 데이터의 재사용을 위해 scale을 많이 사용하고 있으며, 모바일에서도 역시 제작의 효율을 위해 scale을 아주 많이 사용하고 있는 실정입니다.

전투맵 같은 경우에는 부모 오브젝트에 scale을 2배씩 적용한 상태라서, 하위 오브젝트의 스케일이 1이면 설마 괜찮지 않을까..? 라는 마음에 테스트를 해 봤습니다만

 

 

소용없네요. ()

저 건물은 자체 스케일은 1이고, 부모 오브젝트의 스케일이 2인 전투맵입니다. 문제는 그대로.

 

문제를 완벽히 해결하려면 부모 오브젝트까지 스케일이 1이어야 합니다. 즉 무조건 스케일을 쓰면 조명연산에서 문제가 생긴다는 말씀.

 

그러므로 이 문제를 우리 프로젝트에서 해결하려면 2가지 제안을 할 수 있습니다.

1.Direct 라이트를 쓰고, 모든 오브젝트를 ResetXform으로 재정렬시켜 재 익스포트 시킵니다.

2.Direct 라이트를 포기하고 스케일을 자유롭게 씁니다. 단, 방향성이 없는 라이트인 Ambient light 만 사용할 수 있습니다.

 그리고 정림팟장님은 2번을 선택하셨죠.

 

 

 

반응형

댓글