그냥 게임개발자

개발일지_007(언리얼엔진)_더 나은 3D메시 만들기1 본문

엔진스터디

개발일지_007(언리얼엔진)_더 나은 3D메시 만들기1

sudoju 2021. 11. 23. 16:12

■시스템 단위

1 언리얼 유닛 = 1cm

 

■트라이앵글 수

트라이앵글 수는 언리얼 엔진의 퍼포먼스에 직접적으로 연관이 되어있다.

모델을 만드는 데에 있어서 나사 같은 사소한 것들은 신경 쓰지 말자.

플레이어도 모를뿐더러 쓸데없이 추가된 디테일 영역에 지나치게 많은 폴리곤을 낭비하게 된다.

오브젝트를 구성할 때는 폴리곤 수를 끊임없이 확인해야 한다.

 

언리얼 엔진에서 폴리곤 수를 확인하려면 콘텐츠 브라우저에서 스태틱 메시를 더블클릭하여 왼쪽 상단에서 자신이 사용하는 DCC와 폴리곤 수를 확인할 수 있다.

 

■머티리얼 ID

모든 오브젝트는 하나 이상의 머티리얼 ID를 가진다.

각 폴리곤에 어떤 머티리얼이 적용될지 결정하는 데 도움이 된다.

 

단점이 하나 있는데 오브젝트에 머티리얼 ID가 있을 경우 각 머티리얼 ID를 표시하려면 매 머티리얼 ID 마다 다시 렌더링 되어야 한다는 점이다.

예를 들어 한 오브젝트에 머티리얼 ID가 5개 있다고 가정하면 렌더링이 5번 되어야만 최종적으로 한번 더 렌더링 된 후 표시될 수 있다.

머티리얼 ID가 2개인 로봇 모델

 

즉 모델의 머티리얼 ID가 많으면 많을수록 렌더링 비용도 늘어난다는 것을 명심하자.

그러니 프로젝트를 진행하는 동안 머티리얼 ID를 고려해라.

 

■피벗포인트

피벗포인트는 액터를 움직일 때 실제로 원하는 곳에 배치해줄 수 있는 역할을 한다.

자신이 사용하는 DCC에서 피벗포인트를 올바르게 구성해 두었다면 오브젝트를 배치하기만 하면 된다.

 

3D 맥스에서 보면 피벗포인트와 멀리 떨어져 있는 모델이 보일 것이다.

그렇다는 건 이 모델은 언리얼 엔진에 배치할 때 내가 원하는 위치에 배치하기 어려울 수 있다.

또한 이동 또한 아닌 스케일 회전 또한 원하는 것으로 변환할 수 없다.

결론은 피벗포인트를 정확히 잡아야 한다.

 

■라이트맵

라이트맵은 텍스처의 복잡한 빛 그림자와 정보를 저장하는 데 사용

왼쪽 - 라이트맵, 오른쪽 - 섀도우 맵

라이트맵에는 R, G, B채널에 다양한 값들이 저장되어 있기 때문이며 다양한 영역의 라이팅 정보가 R, G, B채널로 패킷이 되어 이상한 이미지처럼 보인다.

섀도 맵에는 초록색 대부분은 빨간색인데 초록색이랑 빨간색은 서로 다른 섀도 데이터를 가지고 있고  R, G, B채널로 저장이 되어있기 때문이다.

 

라이트맵을 제작하기에 앞서 우선 라이트맵의 오브젝트 면이 0~1 공간에 배치되어야 한다.

이 0과 1 외에 밖에 있는 텍스처는 잘라내지만 데이터는 그대로다.

또한 각 면은 고유하게 배치되어야 하는데 즉 UV 아틀라스에서 각자 고유한 공간을 차지해야 한다.

예를 들어 책상을 만든다고 하자 공간을 아끼려면 책상의 상단 UV와 하단 UV를 받아 UV 아틀라스에 서로 합쳐야 할 것이다.

하지만 이 방법은 상단과 하단에 정확히 동일한 디테일을 표시하기도 하는데 이게 베이스 컬러 텍스처에는 문제가 없지만 섀도 맵이나 라이트맵을 적용할 경우 표면 상단과 하단 모두에 정확히 동일한 섀도잉 정보를 얻게 된다.

즉 원래 하단에서만 표시되어야 하는 섀도가 상단에서도 표시가 될 수 있어서 라이팅이 정확하지 않게 된 것처럼 보인다.

이 문제를 피하려면 애셋들이 0~1 공간에 고유하게 배치되어야 한다.

 

또한 3dmax에서는 라이트맵 UV가 채널 2에 저장되면 언리얼 엔진은 채널 1에 저장된다.

언리얼 엔진은 0에서 숫자를 시작하는 반면 3dmax는 1부터 숫자를 시작하기 때문이다.

또한 라이팅 해상도를 메시를 선택한 후 설정할 수 있다.

 

■콜리전

콜리전은 언리얼 엔진에서 많은 것을 결정한다.

콜리전은 월드에서 뭔가에 부딪혔는지 결정하는 데 사용

또 오브젝트가 월드에 충돌하거나 자기들끼리 충돌하도록 만드는 피직스 시뮬레이션에서도 사용한다.

콜리전은 플레이어가 실제로 자기가 밟고 선 표면 위를 걸을 수 있게도 해준다.

콜리전을 만드는 방법은 자신이 사용하는 DCC에서 콜리전을 만든 다음 지오메트리와 함께 임포트 하는 방법이 있고 혹은 언리얼 엔진에서도 콜리전을 만들 수 있다.

 

나는 3dmax를 배우려는 게 아닌 언리얼 엔진을 배우는 입장이기 때문에 언리얼 엔진에서 만드는 콜리전 방법을 포스팅하도록 하겠다.

스태틱 메시를 더블클릭하여 왼쪽 위에 콜리전을 추가할 수 있다.

또 컨벡스 분해라는 옵션이 있는데 콜리전을 만들기가 정말 어려운 유기적인 메시에 쓸 복잡한 콜리전을 만들 수 있는 기능이다.

컨벡스 분해가 보이지 않는다면 창 > 컨벡스 분해를 누르면 된다.

 

이 기능은 메시를 복셀 화하고 그 복셀화를 기반으로 콜리전 파라미터를 생성하는 거다.

메시에 100% 정확한 콜리전을 제공해 주지는 않는다.

하지만 지나치게 많은 버텍스를 사용하거나 메시 자체를 훼손하지 않고도 메시 표면을 수용하는 작업을 해내 준다.

왼(기본 메시에 들어가있는 콜리전) 오(컨벡스 분해로 만든 콜리전)

■오버드로 제한

오버드로는 투명 혹은 오파시티를 다룰 때 나타난다.

GPU가 텍스처 곳곳에 다수의 투명을 만들거나 여기저기가 뚫려 보이게 해서 유용한 정보를 표시하지 않게 한다.

오버드로는 다수의 평면을 겹쳐서 실제 나무, 덤불, 잔디 등과 같은 모습을 보여야 하는 폴리지 메시에서 자주 나타난다.

 

왼쪽은 비디오 게임에서 많이 본 폴리지 유형이며 평면에 매핑되어있다.

왼쪽의 문제점은 줄무늬로 강조된 죽은 영역 전부이다.

나뭇가지 주위의 이 부분 모두 계산을 해놓고 그리지 말라고 한다.

문제는 그리지도 않을 영역에 말 그대로 수백 회에 달하는 계산을 낭비하고 있다는 거다.

여기서 버텍스를 약간 더 사용하거나 평면의 실제 형태를 조정하여 오버드로의 발생량을 줄일 수 있다.

오른쪽의 텍스처를 보면 왼쪽과 정확히 동일한 텍스트이지만 좌측 상단 부분이 완전히 제거되었다.

그렇기에 버텍스가 줄어들어 투명한 죽은 공간의 양이 감소했다.

모든 오버드로를 완전히 없애는 건 절대 불가능하고 그게 목표가 아니다.

목표는 오버드로를 없애는 것이 아닌 제한하는 거기 때문이다.

관리할 수 있는 수준까지 줄이는 거다.

나뭇잎 부분에 사용 중인 형태에 버텍스를 조금 더 추가해서 버텍스를 추가해 텍스처와 최대한 근접하도록 수용하는 것이다.

버텍스 몇 개 더 렌더링 하는 것은 엄청난 수의 픽셀을 렌더링 한 다음 죄다 버리는 것보다는 항상 비용이 적게 들기 때문이다.

왼쪽처럼 그리지도 않을 영역을 매 프레임마다 계산한다면 엄청난 비용이 들 것이다.

씬에 오버로드가 얼마나 있는지 확인하려면 셰이더 복잡도라는 모드를 사용하면 된다.

왼쪽(강의 내용)을 보면 오버로드를 완전히 없애는 것은 어렵다.

최대한 흰색에 가깝지 않게만 만들면 되는 것이다.

그렇지만 내 프로젝트(오른쪽)에서는 빨간색도 없다..

최적화가 잘 되어 있나 보다.

 

■LOD

LOD는 레벨 오브 디테일의 줄임말이며, 메시와 정확히 동일하되 트라이앵글 수가 더 적고 가끔 머티리얼 인스트럭션 수도 더 적은 사본이다.

이 LOD를 사용하는 이유는 정말 엄청난 하이 폴리 메시가 겨우 100, 200 픽셀의 화면만 차지할 때 이걸 전부 그릴 이유가 없기 때문이다.

그보다는 윤곽선이 똑같고 해상도는 훨씬 낮으며 버텍스의 숫자는 절반인 메시를 표시하는 편이 더 낫다.

모델을 만들 때 특히나 중요한데 일정한 유형의 LOD가 필요하다.

LOD 메시는 원하는 만큼 많이 있어도 되지만 그러다가 메시가 너무 많아서 프로젝트에 해가 되는 시점이 오기도 한다.

메시를 얼마나 줄여야 하느냐는 보통 75% 35% 마지막으로 12%까지만 줄이면 된다.

그렇다고 이게 고정 수치는 아니며 자신의 프로젝트에 잘 맞는 수치를 선택하면 된다.

항상 저 수치들이 서로 꽤 차이가 나도록 설정해주어야 메모리를 아낀다는 LOD의 목적이 충분히 발휘된다.

 

LOD는 3Dmax에서 만든다.

LOD를 임포트 할 때에는 Import Mesh LODs를 확실하게 체크해서 설정을 해준다.

보시다시피 폴리곤을 적어졌지만 실제로 보면 그렇게 차이가 나지 않는다.

위에는 LOD가 0에 가까운 것 아래가 LOD가 0보다 더 큰 것의 차이다.

 

또한 LOD를 auto로 설정해 놓으면 멀리 있을 때는 0보다 멀어지고 가까이서 볼 때는 LOD가 0에 가까워진다.

언리얼 엔진은 LOD를 이렇게 표현한다.

 

더 나은 3D 메시를 만들 수 있다는 것은 즉 최적화가 잘 되며 퀄리티는 좋게 만들 수 있다는 것이다.