new GUI (ugui) 최적화 팁

Draw call을 줄이는 것은 최적화 시 가장 중요한 요소중 하나입니다. Unity의 새로운 UI는 이러한 Draw call을 줄이는 것이 매우 용이하게 되어있습니다. 이 글에서는 new GUI의 Draw call에 대해 다루고자합니다.

new UI는 Button, Image 등 UI 컴포넌트를 추가 시 자동으로 Canvas하위로 배치되게 되어있습니다. 
유니티 UI의 Draw call은 이 Canvas 단위로 이루어집니다. Canvas 하위의 UI 컴포넌트들에 쓰이는 이미지가 SPrite packing되어 있다면 모두 하나의 Draw call로 처리가 가능합니다. 그러므로 유니티의 UI시스템을 이용하면 Draw call을 절약할 수 있어서 성능 향상에 매우 도움이 됩니다. 하지만 유니티의 UI를 이용한다고 해서 무조건 Draw call이 하나만 발생하는 것은 아닙니다. 성능 향상을 위해서 숙지하고 있어야 할 사항을 몇 가지 이야기하고자 합니다.


Draw call

그래픽 최적화를 위해서는 Draw call을 줄이는 것이 중요합니다. 이는 UI 역시 마찬가지입니다. 유니티의 UI에서는 Canvas마다 각자의 Vertex buffer를 가지고 있기때문에 Canvas가 두개면 최소 두번의 Draw call이 일어납니다. 이는 Canvas하위에 Canvas가 존재하는 경우에도 마찬가지입니다. 만일 Canvas안에 Canvas를 추가하는 경우에도, 씬 바로 하위의 Canvas는 하나 뿐이지만, 최소 두 개의 Draw call이 발생합니다.
위에도 언급했지만 하나의 Draw call이 되기 위해서는 사용되는 이미지들이 atlas 처리가 되어있어야합니다. 즉, Sprite packing되어있는 sprite들을 사용해야합니다. 다만, atlas 페이지가 두 개 이상으로 나뉘어져있으면 경우에 따라서 두 개 이상의 Draw call이 일어날 수도 있습니다. 따라서 Packing Tag를 잘 나누는 것이 중요합니다.

다만, Canvas 별로 Draw call이 일어난다고해서 무조건 모든 UI요소들을 하나의 Canvas에 몰아넣는 것이 꼭 좋은 솔루션인것만은 아닙니다. 동적으로 반응하는 버튼이나 Fill Image등을 처리하기위해서는 매 번 갱신 비용이 발생하기 때문입니다. Runtime시에 변경되지 않는 이미지와 실시간으로 변경되는 이미지가 같은 Canvas에 존재하면 변경되는 이미지 하나를 처리하기 위해서 Canvas의 Vertex buffer를 갱신하기때문에 쓸데없는 갱신 비용이 발생합니다. 따라서, Draw call을 하나 희생하더라도 정적인 이미지들은 별도의 canvas로 빼두는 것이 효율적일 수도 있습니다. 


Text

Text는 별도의 Texture를 사용하기때문에 별도의 Draw call로 발생합니다. 이 텍스쳐는 font별로 만들어지므로 font의 종류를 줄이는 것이 Draw call을 줄이는 방법이기도 합니다.

따라서 아래의 씬에서는 UI가 차지하는 Draw call이 3입니다. 아이콘 이미지들은 패킹되어있는 상태라서 모두 합쳐서 1개의 Draw call을 차지합니다. 텍스트는 3개가 존재하지만 사용된 폰트는 2개라서 2개의 Draw call을 차지합니다. 따라서 총 3개의 Draw call이 발생합니다.

More More ...

유니티의 새로운 UI를 효율적으로 쓰기 위한 더 많은 팁이나 퍼포먼스를 향상시키기 위한 더 많은 노하우들은 유나이트 서울 2015에서 얻어실 수 있습니다. 오셔서 더 많은 정보와 도움을 얻어가시길 바랍니다 :)


Unity 4.6 프로젝트 Unity 5로의 마이그레이션 후기 UNITY3D

유니티5가 출시된지 보름이 지나고 있습니다. 많은 분들이 유니티4의 프로젝트를 유니티5로 마이그레이션 하는 것에 대하여 걱정을 하고계십니다. 하지만 업그레이드 과정은 복잡할 게 없습니다. 물론 설정을 좀 건드려줘야 하는 부분들도 생기고 귀챦은 일들도 생기긴 하지만 그리 큰 노력이 들지는 않습니다. 또한, PBS 및 실시간 GI때문에 무조건 느려지는 것이 아닌가 걱정도 하시는 분들도 계십니다. 하지만 PBS가 아닌 기존 레거시 셰이더도 이용 가능하며 실시간 GI도 사용 여부를 선택 가능하므로 성능 하락에 대한 걱정은 안하셔도 됩니다. 
어서와 유니티5는 처음이지?

그래서 제가 개인적으로 유니티 4.6으로 만들고 있던 프로젝트를 유니티5로 업그레이드하고 그 과정을 기술하고자합니다. 물론 매우 작은 프로젝트라서 큰 도움이 되실런지는 모르겠습니다. 다만 참고 자료정도로 생각해주시면 감사하겠습니다. 유니티5로 빌드한 프로젝트를 구글 플레이에 올려두었습니다. 아직 테스트 버젼이므로 게임의 완성도는 신경쓰지 마시고 작동 여부정도만 확인해보시면 될 것 같습니다 :)

우선 유니티5로 업그레이드 하기 전에 반드시 프로젝트를 백업해두시길 바랍니다. 업그레이드를 시작하면 돌이킬 수가 없으므로 혹시 모를 불상사는 항상 대비해두셔야합니다. 백업 후 유니티5를 실행하시면 유니티4와는 다르게 프로젝트를 선택하는 창이 먼저 뜹니다. 
업그레이드하려는 프로젝트를 선택하면 잠시 후 다음과 같이 업그레이드를 진행하겠다는 창이 뜹니다. upgrade버튼을 눌러서 업그레이드를 진행합니다. 

이후 유니티가 업그레이드를 알아선 진행합니다. 시간이 좀 지난 후 다음과 같은 창이 뜹니다. 유니티5로 넘어오면서 스크립트 API들이 변경 된 사항들이 있습니다. 이를 자동으로 바꿔주겠단 소리인데 Go Ahead를 선택하여 진행해줍니다. 
이 과정들이 매우 오랜 시간이 소요됩니다. 침착함을 가지고 커피한잔의 여유를 즐기세요 :)


오류 사항들

업그레이드가 완료되고나면 수 많은 에러 상황들이 발생할 것입니다. 그런것 없이 완벽하게 마이그레이션 되었다면 당장 꿈에서 깨어나세요 용사여! 꿈이 아니라면 축하드립니다. 당장 사표 한장 집어던지고 뛰쳐나가서 로또 한장 사세요 :)

맨 처음 눈에 들어오는 것은 스카이박스일것입니다. 스카이박스의 십중팔구는 이미지가 정상적으로 나오지 않을 것입니다. 유니티5에서는 스카이박스가 HDR로 그려지는데 유니티4에서 설정했던 LDR 스카이박스를 가져오면 아래와 같이 깨집니다. 이는 간단히 수정 가능합니다. 해당 스카이박스를 선택 후 inspector창에 나오는 Fix now 버튼을 누르시면 해결됩니다.

셰이더에 문제가 발생하시는 분도 계실 수 있습니다. 유니티에서 기본적으로 제공하는 셰이더만 이용한다면 문제가 발생하지 않으실겁니다. 하지만 커스텀 셰이더를 이용하는 경우는 라이팅이 정상적으로 그려지지 않을 수 있습니다. 저같은 경우는 다음과 같이 이상하게 셰이더가 망가져 보였습니다. 
이는 셰이더로 넘겨주는 normal값때문에 발생하는 문제입니다. 유니티5에서는 셰이더로 넘어오는 vertex의 normal값이 메시의 스케일링이 적용되서 넘어옵니다. 따라서 항상 길이가 1이라는 보장이 없습니다. 또한, unity_Scale.w가 작동하지 않습니다. 그렇기때문에 셰이더에서 normalize를 해주어야 합니다. 이는 binormal, tangent 모두 동일하게 적용됩니다. 또한, 기존에는 라이트의 atten 값을 두배로 뻥튀기해줘야만 했는데 이제는 그러지 않아도 됩니다. 기타 셰이더 관련 가이드를 참고하여 수정하시면 정상적으로 보입니다. ( 본 포스팅 마지막의 링크들 참고)

오브젝트의 스케일이 틀어져있는 경우도 존재합니다. 기존에는 FBX 익스포트 시 적용 된 스케일이 정상적으로 적용되지 않는 문제가 있었는데 이제는 정상 반영이 됩니다. 따라서 FBX 메시들의 스케일이 변경되는 것 들이 있습니다. FBX import 설정에서 스케일을 변경시켜주면 됩니다.
간혹 skinned mesh가 깨지는 경우도 있습니다. 서로 다른 레거시 에니메이션과 메시를 휴머노이드로 조합한 이루어진 오브젝트가 간혹 깨지는 경우가 있습니다. 아직 정확한 조건은 확인하지 못하였습니다. 이런 경우는 답이 없습니다만 매우 드문 케이스이므로 크게 걱정하지는 않으셔도 될 듯 합니다.
유니티5에서는 라이트맵 솔루션이 비스트에서 인라이튼으로 바뀌었습니다. 따라서 라이트맵 관련 설정을 다시 손봐주셔야합니다. 기존 버젼에서부터 만들던 모바일 프로젝트라면 실시간 GI를 사용하지 않는 경우가 대부분일테니 Baked GI 외 다른 옵션들은 다 꺼주시면 됩니다. 
GI 관련하여 라이팅 타입 속성이 추가되었습니다. 라이팅 오브젝트의 인스펙터창에 Baking 타입을 설정 할 수 있는 콤보 박스가 있습니다. Baked로 설정해두면 실시간 라이팅에는 반영되지 않고 라이트맵에만 반영되는 라이트가 됩니다. 제 프로젝트의 경우에는 실시간 라이팅을 전혀 사용하지 않고 IBL만 사용하므로 모든 라이트를 Baked로 설정해두었습니다.

또한, 오브젝트의 인스펙터 창에서도 속성들이 추가된 것 들이 있으니 이를 건드려줘야 합니다. Cast Shadow, Receive Shadows, Use Light Probes는 기존에도 있는 속성이였으나 기존 설정이 날라갔을 수도 있으니 한번 더 확인해줘야합니다. Reflection Probes는 새로 생긴 속성이므로 체크 해제해주어야 의미없는 성능 소모를 줄일 수 있습니다. 

유니티5 에서는 메카님이 대폭 개선되었습니다. 기존 버젼 호환이 최대한 작업이 되어있긴 하지만 트랜지션이 누락되는 경우도 가끔 존재합니다. 또한 state에 Write Defaults라는 속성이 생김으로 인해서 기존에 예측했던 동작과 다르게 보이는 경우도 존재할 수 있습니다. 그냥 메카님은 전체적으로 한번 검토해보시는 것이 좋을 듯 합니다.


기타

제 프로젝트는 이러한 수정 사항들이 있었습니다만 프로젝트마다 수정 필요 사항들이 각기 다를것입니다. 더 자세한 내용은 아래 업그레이드 가이드들을 참고 바랍니다.

공식 메뉴얼 (영문) :
한글 번역본 :

결론적으로 말씀드리자면, 작은 프로젝트 혹은 개발 초기 단계의 프로젝트들은 유니티5로 업그레이드 시 큰 무리는 없어보입니다. 유니티 직원으로서는 무조건 유니티5로 업그레이드 하라고 말씀드리고 싶지만, 현실적으로는 규모가 크거나 출시 임박인 프로젝트는 한번 검토를 해보시는 것이 좋을 듯 합니다.
뭐 어찌되었든 유니티5의 세계로 오신 것을 환영합니다!
이미지 : REPUBLIQUE (Recreated in Unity 5)

Unity에서 쿨타임 버튼 구현하기 UNITY3D

RPG든 액션이든 어떠한 장르에서든 스킬 시스템이 있는 게임은 쿨타임이란 것이 존재합니다. 그리고 이러한 쿨타임은 시각적으로 보여 줄 시 다양한 형태로 표현하지만 크게두 가지 형식으로 표현합니다. 시계/반시계 방향의 부채꼴 또는 수직/수평으로 영역을 채우는 이미지로 표현하는 것입니다.
유니티의 이전 버젼에는 이러한 버튼을 표현해주는 기능이 없어서 직접 구현하거나 플러그인을 사용하여야 했습니다. 하지만 유니티 4.6부터 GUI 시스템이 대폭 개선되어 많은 기능들이 추가되었었습니다.
이 새로운 UI 시스템에서는 이미지를 다루는 기능 역시 대폭 향상되었습니다. Filled 타입 이미지가 추가되었고 이로 인해 손쉽게 쿨타임을 표현해줄 수 있게 되었습니다. 

일단 Hierarchy > Create > UI > Button 으로 버튼을 추가하면 Canvas란 것이 생기고 그 아래 Button이 생긴 것을 확인하실 수 있습니다. 이 Button의 Inspector을 확인해보면 Image와 Button 컴포넌트가 있습니다. 이 중 Image컴포넌트의 Source Image를 원하는 이미지로 바꿔줍니다. 이 때 Source Image는 Sprite 타입의 텍스쳐만 사용 가능합니다. 이미지를 설정 후 Image Type을 Filled로 바꾸면 하위 항목 중 Fill Amount 슬라이더가 생깁니다. 이 슬라이더 값을 0에서 1로 조절 시 이미지가 이에 따라 채워지는 영역이 생깁니다. 쿨타임에 맞게 이 값을 업데이트 해주면 쿨타임 버튼이 되는 것입니다.
다만, 보통은 원래 이미지의 색으로 채워지는 영역 배경에 흑백 또는 어두운 이미지가 존재합니다만 Filled image의 배경 기능은 없습니다. 따라서 같은 위치에 배경을 추가해줘야 합니다. 배경은 단순 이미지만 배치하면 되므로 Create > UI > Image로 이미지를 추가하여 Source Image를 설정해준 뒤 Color을 조절하여 어두운 이미지로 만들어줍니다. Hierarchy에서의 순서가 곧 렌더링 되는 순서이므로 이를 변경하면 됩니다. 배경으로 삼을 이미지를 버튼의 위로 배치하시면 버튼이 배경 위에 그려집니다.
이제 버튼 추가는 다 되었으므로 스크립트를 추가해줘야합니다. 스크립트에서는 쿨타임 값에 맞게 Fill Amount를 조정해주는 동작을 합니다. 또한, 쿨타임 중일 시에는 버튼이 동작하지 않도록 해주어야 합니다. 이러한 내용을 스킬 시스템이나 로직 스크립트에서 직접 컨트롤을 해주어도 되지만 쿨타임 버튼만을 담당하는 스크립트를 만들어두면 버튼을 추가할 때 마다 훨씬 개발하기 수월해질 것입니다.

Project 창에서 우클릭 > Create > C# Script로 스크립트를 하나 생성합니다. 저는 이름을 CoolTimeButton이라고 지었습니다. 스크립트의 내용을 다음과 같이 채웁니다.
버튼이 채워지는 값은  쿨타임 값을 0~1로 변환하여 Image.fillAmount로 설정해주면 됩니다. 쿨타임 동안은 버튼이 작동하지 않도록 하는 것은 Button 컴포넌트의 enable을true/false로 설정해두면 됩니다. 이러한 제어를 매 Update()마다 처리해주는 것입니다. 
스크립트를 완성 후 버튼에 스크립트를 추가해줍니다. 
그럼 이제 버튼이 눌렸을 시 CoolTimeButton 스크립트의 메소드를 호출하도록 하면 됩니다. 이를 위해서 버튼의 Button 컴포넌트 하단의 On Click() 에 있는 +버튼을 눌러서 콜백을 추가해줍니다. Realtime Only 콤보박스 하단의 오브젝트 항목에 버튼 오브젝트 스스로를 설정해주면 Realtime Only 콤보박스 옆의 No Function 콤보박스가 활성화됩니다. 그 콤보박스에서 CoolTimeButton.ResetCooltime()을 설정해줍니다. 이리함으로써 버튼이 눌리었을 시 CoolTimeButton의 ResetCooltime()이 호출되어 쿨타임이 다시 카운팅됩니다. 쿨타임중일 시에는 CoolTimeButton.Update()에 의해 비활성화 처리되므로 버튼을 눌러도 아무런 반응을 하지 않습니다. 쿨타임 자체의 처리는 이제 완료가 되었습니다. 버튼에 연결된 스킬이나 아이템의 스크립트는 마찬가지로 On Click()의 +버튼을 한번 더 눌러서 콜백을 연결해주면 됩니다(아래 예시에서는 SkillNotify). 콜백은 이토록 여러개를 설정 할 수 있어서 다양한 작업을 처리할 수 있습니다.
이처럼 유니티의 새로운 UI기능을 사용하면 UI 작업을 훨씬 수월하게 처리할 수 있습니다. 새로운 UI 시스템의 더 많은 것을 알고싶으시면 공식 튜토리얼 및 에셋스토어 예제를 참고 바랍니다. 감사합니다.

Unity New GUI 튜토리얼 : 
에셋스토어 예제 : 



유니티5 렌더링 파이프라인 확장 기능 : 커맨드 버퍼(Command Buffer) UNITY3D


Unity5에는 스탠타드 셰이더(Standard Shader), 실시간 글로벌 일루미네이션(Real-time Global Illumination), 리플렉션 프로브(Reflection Probe), 향상된 라이트맵(Lightmap) 워크플로우 등 시각적으로 두드러지는 새로운 기능들이 대거 추가가 되었습니다. 뿐만 아니라 성능 및 색공간 등에 관한 내부적인 개선 사항들도 많습니다.

그리고 또 다른 개선사항으로는 기능 확장성에 대한 것을 들 수 있겠습니다. 많은 고민을 통해 커맨드 버퍼(Command Buffer)라는 기능을 추가하였습니다. 이 기능을 사용하면 렌더링 관련 명령 목록을 만듦으로써 렌더링 파이프라인을 확장시킬 수 있습니다.
사실 원래는 그래픽스에서 커맨드 버퍼라는 것은 저수준(low-level)의 컨셉입니다. 어플리케이션에서 DirectX나 OpenGl 같은 그래픽스 API에 명령을 주면 커맨드 버퍼라는 곳에 명령이 쌓이고 GPU는 여기서 정보을 꺼내가서 렌더링을 합니다. 본 포스팅에서 말하는 커맨드 버퍼도 이와 비슷한 개념입니다. 다만 GPU에게 “레지스터 X에게 Y값을 셋팅해”라는 저수준의 명령이 아니라, “이 메시를 저 매터리얼을 사용해서 그려” 등의 명령 목록을 만들 수 있는 고수준(high-level)의 개념인 것입니다.

스크립트에서 커맨드 버퍼를 생성하여 렌더링 명령 설정할 수 있습니다. 이 명령을 카메라 렌더링 과정에서 많은 용도로 사용이 가능합니다. 예를 들자면, 디퍼드 렌더링 과정 중 G버퍼가 끝난 후 추가적인 오브젝트 렌더를 하거나, 일반적인 스카이박스 렌더 후 구름들 추가하는 등 다양한 작업들을 할 수 있게 됩니다. 자세한 내용은 공식 메뉴얼을 참고해주세요.


예시들

그 활용 예로 블러된 굴절 효과를 들 수 있습니다. 스카이박스와 일반적인 불투명 오브젝트가 렌더링 되고나면 현재 렌더된 이미지는 임시적인 렌더 타겟에 저장됩니다. 불투명 오브젝트 앞에 위치한 유리 오브젝트에 설정한 셰이더에서는 이 이미지를 굴절시켜 보여주면 이러한 효과를 얻을 수 있습니다. 이는 shader GrabPass does와 흡사한 개념입니다만 그 보다는 더 많은 커스터마이징 작업을 할 수 있게 됩니다.
또 다른 예로는 커스텀한 디퍼드 라이트(custom deferred light)를 들 수 있습니다. 일반적인 포인트 및 스팟 라이트가 아닌 튜브나 구체 모양 등의 라이트를 표현 할 수 있는 것입니다. 일반적인 디퍼드 셰이딩 라이트 과정이 끝난 후, 커스텀한 라이트를 라이트 버퍼에 그려줄 수 있습니다.
마지막으로 디퍼드 데칼(deferred decal)을 예로 들겠습니다. 전통적인 방식의 데칼은 대상 면의 형태를 그대로 따와서 별도의 메시를 만들어서 얹어주는 방식입니다. 그러다보니 Z파이팅 문제라던가 라이팅 이질감 등의 부작용이 존재합니다. 그러나 디퍼드 데칼은 G버퍼에 박스모양의 볼륨으로 데칼을 직접 그려넣는 방식입니다. 이 과정은 디퍼드 라이팅이 그려지는 방식과 흡사합니다만 라이팅 연산 대신 G버퍼에 텍스쳐만 그려넣는 것입니다. 이렇게 되면 Z파이팅 문제도 사라지고 라이팅도 자연스럽게 적용됩니다.
데모를 다운 받아서 확인해보실 수 있습니다. 코드도 복잡하지 않습니다. 이 행위들을 하는 스크립트는 약 100줄의 코드만으로 이루어져있습니다. 
데모 다운로드 : 


물리 기반 셰이딩으로 작업하기 #2 : 재질 세부 예시 UNITY3D

물리 기반 셰이딩으로 작업하기 #1에서 이어지는 글입니다.


재질 예시


바이킹 마을 씬은 많은 적절한 메모리의 텍스쳐를 사용하여 많은 양의 컨텐츠를 나타내고 있습니다. 그 예로 10미터 크기의 나무 크레인 모델을 살펴보겠습니다.


예시 1: 크레인 오브젝트는 2개의 재질을 가집니다. 2개의 디퓨즈 텍스쳐, 1개의 스페큘러-매끄러움 텍스쳐, 2개의 오클루전 텍스쳐, 2개의 디테일 텍스쳐

예시 2: 방패 프랍은 1개의 재질을 가집니다. 1개의 디퓨즈맵 텍스쳐, 1개의 스페큘러(specular)-매끄러움(Smoothness) 텍스쳐, 1개의 오클루전 텍스쳐를 가집니다. 디테일 텍스쳐는 없습니다.

알베도 텍스쳐 : 스페큘러 워크플로우에서는, 알베토 텍스쳐는 표면에 반응하는 디퓨즈 라이트의 색상을 나타냅니다. 왼쪽 이미지 (크레인)에서는 너무 그렇게 높은 디테일을 필요로하지는 않습니다. 반면 오른쪽 텍스쳐 (방패)는 높은 디테일을 포함하고 있습니다.

크레인의 디퓨즈맵은 나무의 색상으로 평범하게 이루어져있습니다. 디테일도 그냥 적당한 정도로만 이루어져있습니다. 반면 오른쪽에 있는 방패의 이미지는 높은 디테일을 가지고 있습니다.

크레인 재질의 디퓨즈 색상 값

스페큘러 : 논-메탈(비전도체)는 비교적 어두운 그레이스케일의 스페큘러 색상을 가집니다. 반면 메탈은 더 밝고 고유 색상을 띄는 스페큘러를 가집니다. ( 녹슬거나 기름때나 먼지가 있는 부분은 메탈릭이 아닙니다.) 

좌측은 메탈을 표현하기 위한 크레인의 스페큘러 맵(메탈릭 셰이더를 사용하지 않음. 스페큘러 워크플로우). 우측은 방패의 스페큘러 텍스쳐

나무의 표면은 전반적으로 스페큘러가 거의 없다시피합니다. 따라서 나무의 스페큘러는 텍스쳐를 사용하는 대신 단순 생삭값으로 대체합니다.

매끄러움(Smoothness)은 PBS 재질의 핵심 속성중 하나입니다. 이는 재질의 상태, 변화, 결점, 디테일 등을 표현하고 물체가 오래되었는 지 등에 대한 시각적인 힌트를 제공해줍니다. 크레인의 경우, 거칠기가 재질 전반적으로 동일하기때문에 따로 텍스쳐로 사용되지 않고 단순한 값으로만 대체될 수 있습니다. 그 덕에 텍스쳐 메모리를 절약할 수 있습니다.


크레인에 있는 나무의 매끄러움. 텍스쳐 대신 단순 값으로 사용함.

메탈의 표현하기 위한 크레인의 매끄러움 맵(메탈릭 셰이더를 사용하지 않음. 스페큘러 워크플로우). 우측 이미지는 방패의 매끄러움 맵을 나타냄. 나무와 메탈 표면이 공존.

오클루전(Occlusion)은 얼마나 표면이 돌출되었는지에 대한 정보를 빛에 반응하여 나타냅니다. 앰비언트 오클루전(Ambient Occlusion)은 표면의 디테일과 높이를 주변광과 반사광 등으로 표현을 해줍니다. SSAO(Screen Space Ambient Occlusion)을 사용하는 것도 염두해두어야합니다. SSAO와 AO를 같이 사용하게되면 배로 어두워지는 경향이 생길 수 있습니다. AO맵으로 크랙이나 접합부 등을 강조하는데 쓰일 수도 있습니다. 게임이 SSAO나 라이트맵의 AO를 쓰는 경우엔 적합한 용도가 될 것입니다.

첫번째 이미지는 라이트맵 AO, 두번째 이미지는 오클루전 텍스쳐, 세번째 이미지는 디퓨즈의 오클루전, 네번째 이미지는 이미지 효과 SSAO를 보여주고 있습니다.



부가 텍스쳐와 해상도


부가(secondary) 텍스쳐는 디테일의 레벨을 증가시켜주거나 재질의 변화를 제공하는데 쓰일 수 있습니다. 디테일 마스크 속성을 사용하는 것으로 마스킹 될 수 있습니다.

크레인의 디퓨즈 텍스쳐는 비교적 낮은 해상도로 이루어져 있습니다. 이러한 경우 부가 텍스쳐로 표면의 디테일을 부여해줄 수 있습니다. 디테일맵은 타일링되어 표면에 전반적으로 반복되어 집니다. 때문에 낮은 해상도로도 높은 디테일을 표현해줘서 메모리를 절약 할 수 있습니다.

부가 알베도맵과 노말맵은 저해상도의 디퓨즈와 노말맵을 보완해줍니다. 아래 이미지는 크레인의 표면 비교. 왼쪽은 부가 텍스쳐 사용. 오른쪽은 사용 안함.


에셋 스토어에서 다운로드 받아서 확인 해보실 수 있습니다. Unity 5.0.0 RC2 버젼에서 작동합니다.

에셋 스토어 링크 : https://www.assetstore.unity3d.com/#!/content/29140

Unity5 링크 : http://unity3d.com/unity/beta/5.0



1 2 3 4 5 6 7 8 9 10 다음


smallBanner

longBanner

rightSmallBanner

mobile

트위터큰거