퍼온 자료

Unity 유니티 퀄리티, 최적화, 계단현상 관련

ITSkeleton 2020. 6. 18. 11:47
728x90
반응형

출처: http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=12010

 

유니티에 기본으로 들어있는 앵그리보트 씬을 실행하면 

화면이 해상도도 높고 아주 좋아보이는데... 

제가 직접 씬을 하나 만들어서 실행시켜보면... 

오브젝트들의 모서리 부분, 그러니까... 선으로 표현되는 부분이 

계단현상이 심하게 생깁니다. 

앵그리보트에서는 그런현상이 없는데.... 

설정을 하지 않아서 그런건지.... 

방법좀 아시는 분 가르쳐 주세요...

 

-----------------------------------------------------------------------------------------------------------------------------------------------

 

퀄리티설정을 높여보세요. Edit-Project Settings-Quality 
고퀄리티설정이 부담스러우시면, 퀄리티설정 셋팅에서 안티엘리어싱만 2배나 4배정도 해주시면 
괜찮아져요. 또, Component-Image Effects에서 Bloom효과 같은거 잘 섞어주면 괜찮아요.

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: http://blog.naver.com/PostView.nhn?blogId=winterwolfs&logNo=10180058416

 

 - Rendering 렌더링  

 

. 렌더링은 3차원 공간에 물체를 배치하고 이를 모니터 화면에 나타내는 작업이다.

 순서 : 메시정보 구축 -> 재질 설정 -> 카메라 설정

 

메시정보 구축  -  유니티에서는 Mesh Filter ( 메시 정보를 관리 ) 하는 컴포넌트를 사용해서 외관을 파악한다.

재질 설정        -  재질을 관리하는 컴포넌트는 MeshRenderer 라고 함.

카메라 설정     -  Transform 컴포넌트로 위치를 설정

 

 

 

= Mesh

ㄴ 메시 란 ? -  물체를 3차원으로 표현하기 위한  점 , 선 , 면 같은 데이터의 모음

 

. 유니티에서 메시는 정점(Vertex) 와 삼각면(Triangle Face) 로 구성됨

 

- Vertex 가 저장할수있는 정보

  . Position

  - 정점의 위치정보

  . Color

  - 면을 그릴때 이 색상값을 참조하여 면을 그림

  . Normal

  - 정점이 속한 면이 보는 방향 벡터 ( 법선 벡터 )

  . UV

  - 정점에 대응하는 텍스쳐 좌표

  . UV2

  - 보조 텍스쳐 좌표 , 라이트맵 텍스쳐 등에 사용

  . Tangent

  - 정점에서  접선 방향을 지정하는 정보.  보조 텍스처를 이용해서 픽셀 단위로 표면에 효과를 줄때 사용

 

 

= 서브 메쉬

 

보통 메쉬는 하나의 삼각형 집함으로 있지만 , 삼각형 집합을 분할해두면 ? -> 서브 메쉬

즉 인간을 하나의 메쉬로 본다면 얼굴 , 몸 , 팔 , 다리 등 을 서브메쉬로 설정해서 각기 다른 재질을 사용하는거지...

ㄴ 하지만 '서브메쉬를 나누는' 것은 우리가 하는게 아니고 모델링 과정에서 하는듯

 

사용법은 서브메쉬로 만들어진 메쉬 의 Inspector뷰의 일반 메테리얼 부분을 보면 재질이 여러가지로 설정된것을 볼수있음

바꾸면서 놀면됨

 

 

 

= Material & Texture  

  

Material -> 외관을 표현하기 위한 것

ㄴ 셰이더 , 텍스쳐 , 노말맵 등 이 메테리얼에 포함된다.

 

Texture -> 물체의 표면을 자세히 표현할때 사용하는것. 부가적인 정보를 가질수도 있음 

ㄴ 물체의 표면을 저장해두는 경우가 많다.

 

 

- 텍스쳐를 프로젝트뷰에서 선택시 나오는 메뉴( 그림 1은 자주 나올꺼니까 잘봐두자)

- 그림 1

 

 

- 텍스쳐의 용도

  . Texture

 - 물체의 표면에 이미지를 입히는 용도 

  . Normal Map

 - 노멀 정보를 제공하는 용도

  . GUI

 - 이미지를 확대 축소 없이 사용 

  . Cursor

 - 커서를 표현하는데 사용 

  . Reflection

 - 반사에 사용하는 3D 큐브맵 텍스쳐로 변경 

  . Cookie

 - 방향성이 분명한 라이트의 쿠키(빛의 부스러기)를 표현하기 위해 텍스쳐를 사용.

  . Lightmap

 - 표면에 빛을 계산한 결과를 저장하는 라이트 맵으로 텍스쳐를 사용

  . Advanced

 - 세부적인 내용을 사용자가 직접 조정

 

- 텍스쳐의 Advanced 모드는 사용자가 직접 용도를 결정 할수있게함.

옵션의 자세한 설명은 "개발의 정석 185~186"에 자세히 기술되어있음.

 

= UV와 Wrap 모드

ㄴ 메시에 텍스쳐를 입힐때 , 메시는 UV라는 좌표값으로 텍스쳐를 입힘.

 

UV값은 0~1사이의 값 으로 그림의 전체 사이즈를 1로 봤을때의 비율크기

만일 어떤 메시의 UV값이 클때 , 텍스쳐의 처리를 설정하는것이 Wrap 모드

Wrap모드는 2개의 설정값이 있다

 

1. Clamp : 텍스쳐의 마지막 (1) 부분이 쭈욱 늘어나게 텍스쳐를 사용

2. Repeat : 텍스쳐를 반복적으로 (1이 넘어가면 0부터) 사용

 

 

= Filter Mode 와 Aniso Level

 

이미지는 픽셀단위로 관리됨 . 텍스쳐로 불러올경우 텍셀 이라는 단위로 바뀜

텍셀은 카메라의 거리에 따라서 영향을 받음 . 카메라가 근접하면 텍셀이 픽셀보다 커짐 -> 반대는 반대로 적용

 

이렇게 텍스쳐의 축소 확대에 따른 작업을 필터링 Filtering 이라고 함 .

확대 축소에 사용되는 필터링은 등방성 필터링 ( Isotropic Texture Filtering ) . 유니티에서 제공 옵션은 3가지

  . 포인트 Point

 가장 빠른 방법 - 하지만 이미지의 손상 발생

  . 이중선형 Bilinear

 가장 대중적인 방법 . 적절하게 빠르고 적절한 퀄리티

  . 삼중선형 Trilinear

 퀄리티는 좋아지는데 부하가 커짐 

 

근데 등방성 핉터링은 평행한 물체는 좋은데 기울이면 그림이 뭉개짐

그래서 비등방성 필터링 ( Anisotropoc Texture Texture Filtering ) 이라는 방식을 사용

게임에서 많이 나온 안티비방의 비방이 바로 이거임  - ( 등방성과 비등방성은 거리에따른 품질 ) .

ㄴ 추가적으로 안티 엘리어싱(맞나?) 는 계단현상 제거 . 비슷하지만 다른거임

 

그림 1 에서 Aniso Level로 수치를 정할수 있고 , 높을수록 사양 많이 먹고 좋은 그래픽을 선보임

 

비등방선 필터링의 설정은 아래 그림 처럼 할수있다.

 

옵션은 3개

  . Disabled

 - 안써

  . Per Texture

 - 텍스처 별로 설정된 Aniso Level값을 사용할래 

  . Forced On

 - 무조건 최대로 씀

 

- 비슷해 보이는 밉맵 , 등방성 , 비등방성 필터링은 각기 고유한 방식으로 텍스처의 품질을 높여주므로 혼합해서 쓸수있음. 단 많이쓰면 당연히 사양을 많이 처먹음 ^^ 그래서 위그림에서 처음 부분에 플랫폼 별로 설정할수 있뜸

 

 

 

= 밉맵

 

- 거리에 따라 미리 만들어준 축소 텍스쳐를 사용 , 필터링 작업의 계산량을 줄여줌

 

장점 : 위에 설명했잖아

 

단점 : 그림의 크기가 약 30% 커짐 . 거리에 따라 여러장의 텍스쳐를 미리 만들어 준비하므로...

근데 못끔 ㅋㅋ 사실 유니티는 (요즘 모든 프로그래밍) 용량을 희생해서 작업량을 줄인다면 당연히 작업량을 줄이는게 맞음 ㅇㅇ

 

- 프리뷰에서 만들어진 밉맵을 미리 볼수 있음.

 

 

 

 

= 플랫폼과 해상도 설정

 

플랫폼 ( 프로그램 사용 환경 ) 에 따라서 텍스쳐의 옵션을 다르게 줘야할수도 있음

가령 휴대폰에서 사용하면 좀 용량을 줄이고 , PC에서 하면 좀 용량을 늘려서 고퀄로 보는게 좋을듯

 

위에 나오느 그림1 의 옵션 맨아랫부분에서 설정할수있다.

 

 

 

= 렌더 텍스쳐

 

실시간으로 수정 /생성 가능한 텍스쳐임 .

Asset  > Create > Render Texture  눌러서 생성 - 없다고 ? 프로버전이 아니라서 그래,....

 

만든 텍스쳐를 카메라에 연결해줘야해  = 카메라 Inspector 옵션의 Target Texture (맨아랫부분쯤...)에 만든 Render Texture를 선택

-> 연결된 카메라를 통해 카메라가 보는 이미지가 텍스쳐에 저장됨. 카메라 무빙도 적용되는것같아

 

 

 

 

- 자료 출저

개정판 유니티 4 게임 개발의 정석

 

[출처] [Unity] Rendering 렌더링 - Texture , Mesh , Material|작성자 늑대발바닥

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

출처: https://docs.unity3d.com/kr/2018.3/Manual/PostProcessing-Antialiasing.html

 

안티앨리어싱

이 페이지에서는 포스트 프로세싱 스택에 포함된 기본 효과에 대해 설명합니다.

안티앨리어싱(Anti-aliasing) 효과는 앨리어싱 현상을 방지하고 그래픽스를 더 부드럽게 하는 알고리즘입니다. 앨리어싱 현상이란, 직선이 들쭉날쭉하거나 “계단” 모양으로 나타나는 경우를 의미합니다(아래의 왼쪽 그림 참조). 이 현상은 그래픽스 출력 디바이스가 직선을 표시하기에 충분히 높은 수준의 해상도를 가지고 있지 않을때 일어납니다.

안티앨리어싱 효과는 들쭉날쭉한 선 주변에 컬러 셰이드를 덧붙여서 눈에 잘 띄지 않게 합니다. 이 효과는 직선이 들쭉날쭉해지는 현상을 줄여주지만, 직선을 흐릿하게 만듭니다.

왼쪽 씬은 안티앨리어싱 없이 렌더링 되었습니다. 오른쪽 씬은 TAA 알고리즘의 효과를 보여줍니다.

안티앨리어싱 알고리즘은 이미지를 기반으로 하고 있습니다. 이는 과거에 사용되던 멀티샘플링(에디터의 품질 설정에 따름)이 다음의 경우와 같이 올바르게 사용될 수 없는 경우에 아주 유용합니다.

  • 디퍼드 렌더링을 사용하는 경우

  • Unity 버전 5.5 이하 포워드 렌더링 경로에서 HDR을 사용하는 경우

포스트 프로세싱 스택에서는 다음의 알고리즘을 지원합니다.

  • FXAA (Fast Approximate Anti-aliasing)

  • TAA (Temporal Anti-aliasing)

빠른 근사 안티앨리어싱

FXAA 알고리즘은 성능 요구치가 가장 낮으며, TAA 알고리즘을 사용하는 데 필요한 모션 벡터를 지원하지 않는 모바일 또는 다른 플랫폼에 적합합니다. 하지만 상당수의 품질 프리셋 역시 존재하기 때문에 저성능 데스크톱이나 콘솔 하드웨어의 경우에 대안으로 활용할 수 있습니다.

FXAA가 선택된 경우의 안티앨리어싱 UI

프로퍼티

프로퍼티:기능:

Preset 사용할 품질 프리셋입니다. 성능과 모서리 품질 중 무엇을 우선할지 선택할 수 있습니다.

최적화

  • 품질 설정 하향 조정

요구 사항

  • 셰이더 모델 3

자세한 내용과 지원되는 하드웨어 리스트는 그래픽스 하드웨어 성능 및 에뮬레이션 페이지를 참조하십시오.

시간적 안티앨리어싱

TAA는 프레임을 히스토리 버퍼에 축적하여 모서리를 더 부드럽게 하는 고급 안티앨리어싱 기법입니다. 모션의 모서리를 부드럽게 하는 데에는 상당히 효과적이지만, 모션 벡터를 필요로 하며 FXAA보다 더 높은 성능을 요구합니다. 따라서, 이 알고리즘은 데스크톱이나 콘솔 플랫폼에 적합합니다.

TAA가 선택된 경우의 안티앨리어싱 UI

프로퍼티

프로퍼티:기능:

Jitter - Spread 지터 샘플이 분산된 내부 지름(텍셀 단위)입니다. 이 값이 작은 경우 날카롭지만 앨리어싱 현상이 더 크게 발생한 결과물이 출력 되며, 값이 큰 경우 안정적이지만 흐릿한 결과물이 출력 됩니다.
Blending - Stationary 정적 프래그먼트에 대한 블랜딩 계수입니다. 이는 최소한의 액티브 모션을 가진 프래그먼트의 최종 컬러에 히스토리 샘플을 얼마나 블렌딩할지 백분위로 조절할 수 있게 합니다.
Blending - Motion 동적 프래그먼트에 대한 블랜딩 계수입니다. 이는 상당한 액티브 모션을 가진 프래그먼트의 최종 컬러에 히스토리 샘플을 얼마나 블렌딩할지 백분위로 조절할 수 있게 합니다.
Sharpen 고주파수 영역에서 TAA 알고리즘을 사용하면 일부 요소가 손실될 수 있습니다. 날카롭게 하기를 사용하면 이 문제를 해결할 수 있습니다.

제약 사항

  • VR에서는 미지원

요구 사항

  • 모션 벡터

  • 뎁스 텍스처

  • 셰이더 모델 3

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://vallista.tistory.com/entry/Unity3D-AntiAliasing-Anisotropic-Filtering-%EC%95%88%ED%8B%B0-%EC%97%90%EC%9D%BC%EB%A6%AC%EC%96%B4%EC%8B%B1-%EC%9D%B4%EB%B0%A9%EC%84%B1-%ED%95%84%ED%84%B0%EB%A7%81-%EC%A0%81%EC%9A%A9

 

 

1. Settings 에서의 설정.

 

 

(사진 1. Rendering option)

 

위의 사진은 Build Settings > Other Settings > Rendering 부분에 있는 스크린 샷이다.

먼저 여기서 자신이 어떤 Anti-Aliasing을 먹일 건지에 대해서 생각을 해보고 Rendering Path를 해당 설정에 맞게 해주도록 하자.

 

 

(사진 2. Edit > Project Settings > Quality)

 

Quality 설정에서 보면 PC에서나 스마트폰에서 기준 퀄리티를 정할 수 있으며 이러한 퀄리티 레벨별로 Rendering을 먹일 수 있다.

Rendering 하위 옵션에서 보면 Texture Quality가 보이는데 자신 옵션에 맞춰서 설정하도록 하자.

 

Anisotropic Textures

 

 Anisotropic Textures Options 

 성능 

 Disables

 Anisotropic Filter 옵션을 사용하지 않는다. 

 Per Texture

 설정한 Texture에 대해서만 사용한다. 

 Forced on

 모든 텍스쳐에 대해 사용한다. 

 

기본적으로 Forced On을 쓰기를 권장하며 Anisotropic Textures 는 성능을 많이 잡아먹지 않는다.

 

Anti Aliasing

 

기본적으로 MSAA를 사용한다.

 

 Anti-Aliasing Options 

 성능 

 Disabled

 Anti-Aliasing을 사용하지 않는다. 

 2x Multi Sampling

 배수를 2x 적용한 Multi Sampling을 적용한다. (MSAA) 

 4x Multi Sampling

 배수를 4x 적용한 Multi Sampling을 적용한다. (MSAA) 

 8x Multi Sampling

 배수를 8x 적용한 Multi Sampling을 적용한다. (MSAA) 

 

 

2. Texture 에서의 설정.

 

 

(사진 3. 텍스쳐 inspector에서 Texture Type Advanced로 설정할 경우 나오는 화면)

 

Mip Maps은 텍스쳐의 크기를 여러개로 만들어서 점점 멀어짐에 따라서 텍스쳐의 크기를 조절하여 Aliasing 효과를 최적화 하는데 쓰인다.

 

 Generate Mip Maps Options 

 성능 

 In Linear Space

 선형 공간에서 밉맵을 설정한다. 

 Border Mip Maps

 가장자리에서 낮은 수준의 밉맵이 활성화 되는 것을 방지하기 위해 이 옵션을 선택한다.

 Mip Map Filtering

 두 가지 방법으로 밉맵을 필터링 할 수 있다.

 Box : 밉맵을 부드럽게 페이드 아웃 하는 간단한 방법이며 크기에 알맞게 밉맵의 수준이 부드럽고 매끄럽게 된다.

 

 Kaiser : 너무 거리가 멀어 색상이 흐릿한 경우 이 옵션을 사용한다. 

 Fadeout Mip Maps

 밉맵을 진행할 때 뒤로갈 수록 회색으로 페이드를 주고 싶은 경우 게이지바를 어느정도 맞추어 설정하면 페이드를 줄 수 있는 옵션이다. 

 

Wrap Mode는 두 가지가 존재하며 타입에 따라 성능값이 틀려진다.

 

 Wrap Mode Options 

 성능 

 Repeat

 반복하는 텍스쳐를 사용할 때 이어질 수 있게 할 때 사용한다.

 Clamp

 텍스쳐의 마지막 픽셀에 lerp를 넣어 부드럽게 보이게 하며 사이를 확실히 구별 할 수 있도록 보이게 한다

 

Filter Mode는 3D 변환하여 연산되는 경우 텍스쳐 필터링 방법을 선택한다. (MSAA에서는 텍스쳐에는 따로 설정을 해주어야 한다. MSAA 자체가 텍스쳐가 아닌 외곽선을 대상으로 샘플링하기에)

 

 Filter Mode Options 

 성능 

 Point

 텍스쳐를 최대한 고르게 한다. 

 Bilinear

 텍스쳐 질감과 다른 밉 레벨 사이를 이중 보간한다.

 Trilinear

 텍스쳐 질감과 다른 밉 레벨 사이를 삼중 보간한다. 

 

Aniso Level은 레벨에 따라 가파른 각도로 질감을 볼 때 텍스쳐 품질을 높인다.

바닥 모델과 바닥 텍스쳐에 사용하는데 적합하다. 즉 바닥 텍스쳐나 바닥 모델은 멀리 갈 수록 한없이 작게 보이므로 aliasing이 빈번하게 일어나는 곳중 하나기 때문에 성능에 맞게 게이지를 채워서 쓰도록 하자.



출처: https://vallista.tistory.com/entry/Unity3D-AntiAliasing-Anisotropic-Filtering-안티-에일리어싱-이방성-필터링-적용 [VallistA]

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=hjine01&logNo=221221081757&categoryNo=0&proxyReferer=&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

2. 유니티 삽질 예방 팁

 

막 쓰다보니 글이 정신없습니다

양해부탁드립니다

 

1.스프라이트 화질이 구졌음

 

 

 

Compression 을 높게 설정해주세요

 

Filter Mode가 

Bilinear이면 스케일을 크게했을때 안티얼레이싱이 되고 (부드러운 확대)

Point로 설정하면 확대해도 픽셀이 그대로 유지됩니다 (도트겜에 적용하자)

 

 

2.유니티 기본설정으로 1픽셀은 0.01이다

 

 

3.카메라 사이즈에 대한 이해

 

1280x720 해상도를 기준으로 게임을 만든다고 하자

카메라사이즈는 몇이여야 할까?

 

카메라 사이즈는 스크린의 세로를 기준으로

 

카메라 사이즈 : 스크린 세로 / 2 / 100

 

1280x720 사이즈 : 720 / 2 / 100 = 3.6

 

스크린을 늘렸을때 세로는 고정이고 가로가 길어지기 때문에

스크린의 세로가 중요합니다

 

3.1 - 현재 디바이스의 스크린의 크기는

int width = Screen.width;

int height = Screen.height;

로 얻어올수있습니다

 

3.2 - 해상도 강제로 바꾸기

Screen.SetResolution(1280,720,true);

 

 

4. Find계열 함수를 최소한으로 사용하자

 

GameObject.Find("");

GameObject.FindGameObjectWithTag("");

GetComponent<GameObject>();

Camera kamera = Camera.main;

등 함수들 

 

모든 게임오브젝트를 돌며 찾아내는것으로

상당한 비용이 듭니다

 

(Camera.main도 게임오브젝트중 tag가 MainCamera인 오브젝트를 반환해주는것이다)

 

    Transform kamera;

    Transform player;

    Test test;

 

    void Start () {

        kamera = Camera.main.transform;

        player = GameObject.FindGameObjectWithTag("Player").transform;

        test = GameObject.FindGameObjectWithTag("Test").GetComponent<Test>();

    }

 

선언후 딱 한번 저장해서 두고두고 쓰자

 

 

 

 

 

5. 유니티 스프라이트 사이 벌어짐

 

 

 

 

스프라이트가 멀티플일때 발생합니다

 

이유는 모르겠지만

추측상 유니티의 Batches기능으로 일어나는듯해요 (같은텍스처를 메모리상에서 같이 써서 최적화해주는 기술)

 



 

최적화 무시하고 그냥 따로씁시다



출처: https://202psj.tistory.com/1290?category=640054 [알레폰드의 IT 이모저모]

728x90
반응형