유니티 어떻게 랜더링을 하는가 - yuniti eotteohge laendeoling-eul haneunga

다음 팁에서는 Unity 렌더링 기능을 사용하여 현실을 사실적으로 모방하는 방법과 프로젝트에서 실제 같은 시각 요소를 구현하는 방법을 배울 수 있습니다. 설명할 내용은 다음과 같습니다.

  • 리니어 렌더링 모드
  • 렌더링 모드
  • 포스트 프로세싱 활성화
  • HDR(High Dynamic Range) 카메라
  • HDR 라이트맵 인코딩(선택 사항)
  • 뷰포트에서 이미지 효과 사용

자세한 내용은 Unity 조명 및 렌더링 튜토리얼을 참조하십시오.

리니어 렌더링 모드

간단히 설명하자면, 리니어 렌더링 모드는 Unity가 물리적으로 정확한 계산 방식을 사용하여 조명 및 셰이딩 계산을 수행한 후 모니터에 가장 적합한 최종 포맷으로 출력을 변환하도록 준비시킵니다.

감마 또는 리니어 워크플로를 지정하려면 다음 단계를 따르십시오.

  1. Unity에서 Edit > Project Settings 로 이동한 후 Player 카테고리를 선택합니다.

  2. Other Settings > Rendering 으로 이동한 후 Color SpaceLinear 로 변경합니다.

색 공간 정의는 최종 셰이딩 및 조명 결과물에 매우 큰 영향을 주기 때문에 프로젝트에서 가장 일찍 결정해야 하는 항목 중 하나입니다. 각 워크플로에 대한 자세한 내용은 리니어 또는 감마 워크플로를 참조하십시오.

렌더링 모드

Spotlight Tunnel 샘플 씬은 디퍼드 셰이딩 렌더링 경로를 사용합니다. 이를 통해 다음을 수행할 수 있습니다.

  • 여러 개의 동적 광원을 효율적으로 사용

  • 여러 개의 반사 큐브맵을 조합

  • Unity 2017 이상에서 기존 스크린 공간 반사 기능을 사용

에디터에서 렌더링 경로를 설정하려면 Edit > Project Settings 로 이동한 다음 Graphics 카테고리를 선택하거나 씬에서 Main Camera 를 선택한 다음 인스펙터 창에서 Rendering Path 를 설정합니다.

렌더링 모드에 대한 자세한 내용은 렌더링 파이프라인 세부 정보를 참조하십시오.

포스트 프로세싱 활성화

HDR 조명을 올바르게 표시하려면 프로젝트에 Unity 포스트 프로세싱 스택 V1을 설치한 후 다음 단계에 따라 톤 매핑을 설정하고 사용하십시오.

  1. 프로젝트에서 Post-Processing Profile 에셋을 생성하고 다음과 같이 설정합니다.

    • Color Grading > Tonemapper > Filmic (ACES) (Academy Color Encoding Standards)을 활성화합니다. ACES 톤 매핑을 사용하여 고강도 컬러 값(예: 컬러 조명 또는 불)을 처리하는 방법은 고강도 컬러를 참조하십시오.
    • Enable Dithering. 디더링을 이용하면 씬에서 HDR 씬의 8비트/채널 출력으로 인한 줄무늬 결함을 완화할 수 있습니다. 최신 엔진들은 이 기술을 사용하여 16M 컬러 출력의 한계를 극복합니다.
    • Tonemapper 설정의 나머지 옵션은 기본값으로 유지하십시오.
  2. 씬에서 Main Camera 를 선택하고, 인스펙터 창에서 Add Component 를 클릭한 후 Post-Processing Behaviour 를 선택합니다.

  3. Profile 필드에 생성한 포스트 프로세싱 프로파일을 입력합니다.

Spotlight Tunnel 씬 샘플에서는 포스트 프로세싱 스택 V1을 사용합니다. 포스트 프로세싱 스택 V2 사용에 대한 내용은 package readme를 참조하십시오.

HDR(High Dynamic Range) 카메라

사실적인 조명을 렌더링할 때는 실제 조명과 매우 유사하고 밝기가 1보다 높은(HDR) 발광 표면과 조명 값을 처리합니다. 그런 다음에는 이 값을 적절한 화면 범위에 리매핑해야 합니다(톤 매핑 참조). HDR 설정을 이용하면 Unity 카메라가 높은 값을 클립하지 않고 처리할 수 있어서 매우 유용합니다. HDR을 사용하려면 씬에서 Main Camera 를 선택한 후 인스펙터 창에서 Allow HDR 이 선택되어 있는지 확인하십시오.

HDR 라이트맵 인코딩(선택 사항)

Spotlight Tunnel 샘플 씬에서는 베이크된 조명을 사용하지 않습니다. 하지만 베이크된 HDR 조명을 사용하려는 경우 라이트맵 인코딩을 HDR 라이트맵으로 설정하여 일관된 결과물을 얻으십시오.

Unity에서 라이트맵 인코딩을 설정하려면 Edit > Project Settings 로 이동한 다음 Player 카테고리를 선택하고 Other Settings 패널을 펼친 후 Lightmap Encoding 을 선택합니다. 자세한 내용은 라이트맵: 기술 정보를 참조하십시오.

뷰포트에서 이미지 효과 사용

씬을 작업하면서 톤 매퍼를 확인하려면 씬 뷰 상단의 드롭다운 툴바 메뉴에서 Image Effects 를 활성화하십시오. 다음 이미지에서는 톤 매핑된 씬에서 하이라이트 연색(highlight rendition)과 어두운 터널 값 분리가 개선된 것을 확인할 수 있습니다. 톤 매핑되지 않은 씬을 살펴보면 하이라이트가 통합된 컬러로 모이지 않는 것을 볼 수 있습니다(이 경우 노랗게 불타는 태양).

유니티 어떻게 랜더링을 하는가 - yuniti eotteohge laendeoling-eul haneunga
톤 매핑이 적용되지 않은 씬과 ACES 톤 매핑이 적용된 씬 비교

이 설정에서는 근본적으로 디지털 카메라가 (노출 적응/시각 적응을 사용하지 않고) 고정 노출 상태에서 씬을 캡처하는 방법을 재현하려고 합니다.

이제 광범위한 콘텐츠에서 사실적인 결과물을 얻을 수 있는 적절한 기본 씬 렌더링 설정을 활용하실 수 있습니다.

유니티 어떻게 랜더링을 하는가 - yuniti eotteohge laendeoling-eul haneunga

  • 2018–03–23 페이지 게시됨
  • 실제 같은 시각 요소 만들기 베스트 프랙티스 가이드가 Unity 2017.3에 추가됨

#1. 렌더링

렌더링(Rendering)이란 컴퓨터 프로그램을 통해 가상의 3D 공간에 위치한 물체를 모니터 화면으로 그려내는 작업을 말한다.

2D 에서의 드로우(Draw)랑 비슷한 의미라고 보면 된다. 3D 에 그리면 렌더링, 2D 에 그리면 드로우.

#2. 렌더링 컴포넌트

3D 공간에 물체를 배치하는 과정은 아래와 같다.

[메시 정보 구축 -> 재질 설정 -> 카메라 설정]

유니티에서는 첫 번째 단계인 메시 정보 구축을 위해서 메시 필터(Mesh Filter)라는 컴포넌트를 제공한다. 메시 필터는 단순히 메시만 관리하는 기능을 한다.

여기서는 큐브의 메시 필터를 보여주도록 한다.

유니티에서는 물체를 렌더링할 때 게임 오브젝트에 메시 필터 컴포넌트가 있다면 메시 필터 컴포넌트에 지정된 메시 정보를 찾아 물체가 어떻게 생겨먹었는지를 파악을 해준 뒤, 이를 화면에 렌더링 해준다. 위에 붉은 사각형에 Mesh Filter 에 뭐가 등록되어 있는가 잘 보자. 

GameObject -> Cube 메뉴를 통해서 Cube 를 생성했지만, Mesh Filter 컴포넌트를 통해서 아래와 같이 다른 메시 정보를 불러올 수도 있다.

붉은 사각형에 있는 버튼을 클릭하면 왼쪽에 Select Mesh 창이 뜨는데 여기서 원하는 메시 정보를 재등록할 수도 있다.

첫 번째 단계를 통해 렌더링할 물체의 외형적인 정보를 정하였으면, 이제는 두 번째 단계로 넘어가보자.

두 번째 단계는 이 물체를 어떻게 칠할지 결정해야 한다. 저렇게 메시만 달랑 있으면 뭔가 많이 허전하지 않은가?

이를 위해서 유니티에서는 재질(Material)이라 불리는 애셋을 제공한다.

Inspector 뷰 에서 메시 렌더러(Mesh Renderer) 컴포넌트에서 재질을 설정할 수 있다.

Element 0 이라고 되어 있는 부분을 보면 Default-Diffuse 라고 재질이 미리 설정되어 있는 것을 볼 수 있다. 위에 Mesh Filter 와 마찬가지로 우측에 둥근 버튼을 클릭하면 재질을 다른 것으로 바꿀 수 있다.

Size 는 Element 의 갯수를 지정해주는 것이다. 1개일 경우에는 하나의 재질만 입혀지지만, 2개 이상일 경우 갯수에 따라서 하나의 오브젝트에 여러가지의 재질이 입혀지게 된다.

Default-Particle 로 한번 바꿔보자. 그리고 Mesh Renderer 컴포넌트 밑에 보면 해당 재질의 간략한 정보를 볼 수 있다.

큐브의 모습이... 참.. 말로 표현하기 힘들게 바뀌었다.

#3. 메시

메시(Mesh)란 컴퓨터 그래픽에서 물체를 3차원으로 표현하기 위해 사용되는 점, 선, 면 같은 데이터의 묶음을 의미한다.

메시는 정점(Vertex)와 정점 3개가 모여서 만들어진 삼각면(Triangle Face)로 구성된다. 그리고 이 삼각면들이 모여서 하나의 완전한 메시가 만들어진다.

우리가 흔히 알고 있는 점이 모여서 선이되고, 선이 모여서 면이되고, 면이 모여서 입체가 된다. 와 비슷해서 어렵지는 않을 것이다.

아까 생성한 큐브를 한번 보자. 삼각면들이 여러개가 모여서 하나의 큐브를 구성하고 있는 것을 알 수 있다.

정점(Vertex)에는 가장 기본적인 위치 정보가 들어가며, 정점별로 추가 정보를 넣을 수 있다. 이 추가 정보들에 따라서 렌더링을 할 때 여러가지 영향을 미치게 된다.

color    : 정점의 색상 정보.

normal  : 정점의 노멀 정보. 정점이 속한 면이 향하는 방향을 결정하는데 사용한다. 우리말로 하자면 '법선' 이라고도 한다.

uv        : 정점에 대응되는 텍스쳐 좌표. 이 정보를 사용해서 삼각면에 텍스쳐가 입혀진다.

uv2       : 보조 텍스쳐 좌표. 라이트맵 텍스쳐에 주로 사용한다.

tangent : 정점에서 접선 방향을 지정하는 정보. 범프매핑(BumpMapping)같이 보조 텍스쳐를 사용해 픽셀 단위로 표면에 효과를 줄 때 사용.

이렇게 정점 정보가 완성이 되면 이를 기반으로 삼각면의 정보가 구성이 되며, 삼각면의 구성되면서 하나의 메시가 된다. ...뭔가 같은 말을 계속 하는 것 같다;;

#4. 모델링 데이터 불러오기

유니티는 기본적으로 게임을 제작하게 도와주는 엔진이지 3D 모델링 소프트웨어(3dMax, Maya 등)처럼 메시를 직접 편집하는 기능같은 것은 제공하지 않는다. ...그런거까지 다 제공하면 3dMax, Maya 는 어쩌라고..;; 

그런고로.. 유니티에서 모델링된 메시를 사용하기 위해서는 전문 3D 모델링 소프트웨어에서 메시를 제작한 뒤에 유니티에서 불러들여서 사용해야 한다. 그러나 유니티와 3D 모델링 소프트웨어와의 환경이 차이가 나기때문에, 외부에서 제작된 메시 데이터를 정확하게 불러들이기 위해서 유니티에서는 FBX 임포터(FBX Importer)라는 것을 제공한다.

여기서는 무료 애셋을 다운을 받아서 FBX 임포터에 대해서 살펴보도록 한다.

이렇게 FBX 확장자를 가진 애셋을 선택하면 Inspector 뷰에 FBX 임포터가 나타난다.

Scale Factor                 : 유니티에서 쓰일 모델러를 유니티에 크기에 맞게 조정.

Mesh Compression       : 메시 압축을 통해 메시 크기를 줄일지 설정. 압축이 높을 수록 데이터의 양은 줄어들지만 모델링의 변형이 있을 수 있다.

Read Write Enabled       : 모델의 정점과 인덱스 정보를 스크립트로부터 접근할 수 있게 설정.

Optimize Mesh             : GPU 버텍스 캐싱 효율을 높이기 위해 메시의 정점을 재배치.

Generate Colliders        : 메시 충돌체 생성.

Swap UVs                   : UV 축을 뒤집는다.

Generate Lightmap UVs : 라이트매핑 기능을 적용하기 위한 uv2 채널을 생성.

Normals & Tangents      : 정점의 노멀(Normal)과 접선(Tangent)벡터를 생성하는 방식을 지정.

Smoothing Angle           : 지정한 각도보다 두 삼각면 사이의 각도가 작으면 소프트 엣지로 파악하고 부드럽게 보간하기 위한 노멀 벡터를 계산.

Split Tangents               : 두 개의 삼각면이 공유하는 정점에 대해 삼각면별로 접선 벡터를 별도로 생성할지 결정.

Import Materials            : 재질을 자동으로 생성.

Material Naming            : 재질의 이름 규칙 지정.

Material Search            : 기존 생성된 재질의 위치를 파악한 후 새로 생성할 재질의 위치를 결정. 

....적어놓고 보니까 꽤 많다... 사실 제일 좋은 방법은 아예 3D 모델링 소프트웨어에서 모델링을 만들 때 유니티의 시스템을 감안해서 제작하는 것이 좋다. 물론 유니티에서 제공하는 이 FBX 임포터를 통해서 조정할 수는 있지만 완벽하지는 않을 뿐더러... 복잡하다.. 눈물 날 것 같다.

#5. 3D 모델을 유니티에서 불러올 때 고려해야 할 사항들

- 정점 데이터의 증가

: 모델링 소프트웨어에서 하나의 정점에 2개의 노멀 정보가 할당되어 있는 데이터를 유니티로 불러들이면 유니티는 정점을 하나 더 늘려 2개의 정점에 각각 노멀 정보를 하나씩 저장한다. 이 때문에 모델링 소프트웨어에서 보이는 정점의 수와 유니티에서 보이는 정점의 수가 차이가 나게 된다.

- 모델링 표준 포맷

: 자주 사용하는 3dMax(max 확장자), Maya(mb 확장자)에서 만든 모델링을 바로 유니티에 불러오면 자동으로 FBX 포맷으로 변환한 다음에 불러지게 된다. 그러나 이런 방식보다는 자체 그래픽 소프트웨어에 탑재되어 있는 FBX Exporter 툴을 이용해서 FBX 포맷으로 수동 변환한 뒤 유니티에 불러오는 것을 권장한다. 그러나 이 FBX Exporter 툴이 오래된 버전일 경우 제대로 동작하지 않을 경우도 있으니 되도록이면 해당 유니티 버전에 맞는 버전을 받아서 사용하는 것을 권장한다.

- 3차원 좌표계

: 유니티는 Y축이 위를 향하는 왼손 좌표계를 사용한다. 그런데 어떤 소프트웨어에서는 Z축이 위를 향하는 좌표계를 사용하는 경우가 있다. 이런 경우 해당 소프트웨어에서 작업한 모델링을 유니티에서 불러오면 거지같은 상황이 연출될 가능성이 높기 때문에, 모델링 소프트웨어에서 왼손 좌표계로 맞추어서 제작하는 것이 좋다.

- 유니티 스케일

: 유니티에서는 1의 단위는 1미터를 의미한다. 스케일의 경우에는 FBX 임포터에서 Scale Factor 에서 손쉽게 조절이 가능하기 때문에 크게 무리할 필요는 없다.

- 삼각면의 법선 방향

: 유니티에서는 메시의 법선 방향과 일치하는 앞면만 그리고, 뒷면은 그리지 않는다. 때문에 메시 내 삼각면의 법선 방향이 잘못되어 있는 경우 그래픽 소프트웨어에서는 잘 보이는 물체가 유니티에서는 안 보이는 현상이 일어날 수도 있다.

참조 자료 -

유니티 4 게임 개발의 정석