티스토리 뷰
Arm & Unity Presents: 3D Art Optimization for Mobile Applications - Geometry, Texture
연홍 2021. 3. 17. 17:01learn.unity.com/course/3d-art-optimization-for-mobile-gaming-5474
Arm & Unity Presents: 3D Art Optimization for Mobile Applications - Unity Learn
In this intermediate course, participants will learn how to produce performance-optimized 3D assets and scenes for mobile applications. Topics will cover tips on optimizing Geometry, Textures, Materials, Shaders, and Lighting. This course was created with
learn.unity.com
위 코스에서 활용할 만한 내용만 정리.
Arm Streamline을 사용한 프로파일링
Unity 프로파일러는 런타임에 특정 작업이 예약된 시기를 표시하지만 사용가능한 CPU 또는 GPU 리소스 또는 프로파일링중인 모바일 장치에서 이러한 리소스가 어떻게 사용되고 있는지는 표시하지 않습니다 .
Arm Streamline 은Arm Mali GPU를 사용하는 기기에서 Android 애플리케이션을 디버깅하고 최적화하기 위한 성능분석도구제품군인 Arm Mobile Studio의 일부로 제공되는 성능 프로파일러입니다. Streamline은 루팅되지 않은 장치에서 실행되는 게임을 분석하고 모바일 응용 프로그램이 장치의 리소스를 사용하는 방식을 이해하는 데 도움이되는 성능카운터 데이터를 제공합니다.
Streamline은 CPU 활동을 측정하여 사용량을 줄일 수 있는 영역을 찾고 모바일 애플리케이션의 문제 영역에서 활성 GPU 워크로드를 분석합니다. GPU가 너무 작아서 렌더링하거나 화면을 벗어나거나 과도하게 그릴 수 없는 삼각형을 처리하는 방법을 살펴볼 수 있습니다. Streamline은 셰이더 성능 및 텍스처 사용량을 평가하는데도 도움이됩니다.
여기에서 Arm Streamline을 사용하여 모바일 애플리케이션을 프로파일 링하는 방법에 대해 자세히 알아볼 수 있습니다 .
Arm Mobile Studio | Get started with Streamline – Arm Developer
A quick start guide to help Arm Mobile Studio users get up and running with Streamline Performance Analyzer.
developer.arm.com
지오메트리 Geometry 관련
Geometry(or a polygon mesh) is a collection of vertices, edges, and faces that make up the shape of a 3D object.
Triangle과 Polygon의 사용
성능을 최적화하려면 주어진 시간에 화면에 표시되는 삼각형의 수를 알고 있어야합니다.
3D모델의 의도된 품질과 일관된 성능 간의 올바른 균형을 유지하려면 최소 삼각형 수를 사용하는 것이 중요합니다.
다음 이미지는 두 3D 개체 간의 비교를 보여줍니다. 한 개체는 584 개의 삼각형을 사용하고 다른 개체는 704 개의 삼각형을 사용합니다. 두 개체 모두 음영 처리 모드에서 동일하게 보입니다. 이것은 실루엣에 기여하지 않는 모델의 모서리를 제거 할 수 있음을 보여줍니다.
Unity에서 메시 인덱스 버퍼의 형식은 3D 객체가 사용할 수있는 최대 Vertex 수를 나타냅니다.
- 16 비트 인덱스 버퍼는 최대 65,535 개의 Vertex를 지원합니다.
- 32 비트 인덱스 버퍼는 최대 40억 개의 Vertex를 지원합니다.
Triangle을 더 적게 사용하면 GPU가 처리할 Vertex가 더 적다는 것을 의미합니다. (==처리할 Vertex가 적으면 전반적인 성능이 향상.)
가능한 한 많은 대상 장치에서 애플리케이션을 보거나 테스트하는 것이 중요합니다. 컴퓨터 화면에서만 애플리케이션을 테스트하면 최적화에 필요한 정보를 얻을 수 없습니다.
모바일 장치 화면은 일반 컴퓨터 모니터보다 작습니다. 따라서 많은 삼각형을 사용하는 세부 정보가 모바일 장치에서 보이지 않을 수 있습니다. 가장 좋은 방법은 카메라에 더 가까운 3D 개체에 더 많은 삼각형을 사용하고 배경에있는 3D 개체에 더 적은 삼각형을 사용하는 것입니다.
대부분의 모바일 장치의 작은 화면 크기와 응용 프로그램의 3D 개체 위치로 인해 3D 개체의 많은 작은 삼각형 세부 정보가 표시되지 않을 수 있습니다. 즉, 보이지 않을 수있는 작은 세부 사항보다는 물체의 실루엣에 기여하는 큰 모양과 부분에 집중해야합니다.
다음 이미지는 개체의 실루엣을 빨간색으로 강조하여 다양한 모양이 개체에 어떻게 기여하는지 보여줍니다.
화면에 자주 표시되지 않는 영역에는 Triangle을 더 적게 사용하십시오. 예를 들어 자동차 바닥이나 옷장 뒷면이 있습니다.
작은 세부 사항을 모델링하기 위해 고밀도 Triangle Mesh를 사용하지 마십시오. 대신 텍스처와 노멀 맵을 사용하세요.
카메라의 POV에서 한 번도 볼 수없는 물체의 뒷면이나 바닥을 삭제하는 것이 좋습니다. 그러나 이것은 Scene의 재사용 성을 제한 할 수 있으므로 신중하게 수행해야합니다. 예를 들어 테이블 메시의 하단 부분을 삭제하면 더 이상 해당 모델을 거꾸로 배치하거나 다른 용도로 배치 할 수 없습니다.
미세 삼격형은 물체나 씬의 최종모습에 크게 기여하지 않는 작은 삼각형입니다.
다각형 수가 많은 3D 개체가 카메라에서 멀어지면 미세 삼각형 문제가 발생합니다. 마이크로 삼각형은 크기가 1 픽셀에서 10 픽셀 사이 인 삼각형이라고도합니다.
마이크로 삼각형은보기에는 너무 작지만 처리하기에는 계산 비용이 많이 듭니다.
다음 이미지는 3D 개체가 카메라 근처에있을 때 사용되는 삼각형의 수 (오른쪽)와 멀리있을 때 사용되는 삼각형의 수 (왼쪽)를 보여줍니다.
다음 이미지의 경우 강조 표시된 영역에있는 대부분의 삼각형이 너무 작아서 모바일 장치에서 볼 수 없습니다. 따라서 최종 모양에 크게 기여하지 않습니다
이 문제를 완화하기 위해 취할 수있는 몇 가지 단계는 다음과 같습니다.
- 카메라에서 거리를 변경하는 오브젝트의 경우 LOD를 사용합니다. 올바른 LOD를 사용하면 객체가 더 멀리 떨어져있을 때 단순화됩니다.
- 배경 객체에 삼각형을 적게 사용합니다.
- 더 미세한 디테일을 만들기 위해 다각형을 사용하지 마십시오. 대신 텍스처와 노멀 맵의 조합을 사용하십시오.
- 길고 얇은 삼각형이있는 오브젝트에는 반짝이는 머티리얼을 사용하지 마십시오. 깜박임이 발생합니다.
- 화면에서 보기에는 너무 작거나 최종 이미지에 많은 가치를 추가하지 않는 모든 정점 또는 삼각형을 병합합니다.
- 삼각형의 가장자리에 비해 내부 영역이 더 많은지 확인하십시오. 기술적으로는 삼각형을 등변(equilateral)에 가깝게 유지하는 것이 좋습니다.
- 영역에서 삼각형을 10 픽셀 이상으로 유지하십시오.
- 가능하면 물체에서 길고 얇은 삼각형을 제거하십시오.
마이크로 삼각형의 사용을 최소화하는 것이 중요한 데에는 몇 가지 이유가 있습니다.
- GPU는 최종 씬에 값을 추가하지 않는 경우에도 모든 삼각형과 정점을 처리해야하므로 불필요한 GPU 사이클이 발생합니다.
- 처리를 위해 더 많은 데이터를 GPU로 보내야하는 경우 메모리 대역폭에 부정적인 영향을받습니다.
- 필요한 처리량은 모바일 장치의 배터리 수명에 영향을줍니다. 따라서 데이터가 적을수록 배터리 수명이 길어집니다.
Level Of Detail (LOD)
LOD (Level of Detail)를 사용하면 카메라에서 오브젝트의 거리에 따라 씬의 각 오브젝트에 대해 렌더링되는 정점 수를 제어 할 수 있습니다. 이렇게하면 응용 프로그램의 성능이 향상됩니다.
LOD는 또한 먼 물체에 대한 마지막 튜토리얼에서 논의 된 마이크로 삼각형 문제를 방지합니다. 응용 프로그램이 실행되는 동안 카메라와의 거리가 변경되는 모든 3D 개체에 대해 LOD를 최적화하는 것이 좋습니다.
다음 이미지는 LOD 관리를 사용하여 모델이 카메라에서 멀어 질 때 적절한 수준의 세부 정보를 유지하면서 3D 모델의 복잡성을 줄이는 방법을 보여줍니다.
LOD를 사용할 때 기억해야 할 몇 가지 주요 사항은 다음과 같습니다.
- 삼각형 수를 줄일 때 삼각형이 물체의 실루엣에 어떤 영향을 미치는지 염두에 두십시오.
- 평평한 영역에서 더 많은 폴리곤을 제거합니다.
- 기능적으로 텍스처용 LOD인 밉맵을 모델과 함께 사용해야합니다.
- LOD는 셰이더 복잡성에도 적용될 수 있습니다. 셰이더와 머티리얼은 멀리있는 3D 오브젝트에 최적화 할 수 있습니다. 예를 들어 오브젝트가 카메라에서 멀어짐에 따라 사용하는 텍스처 수를 줄일 수 있습니다.
LOD는 모든 상황에 적합하지 않습니다. (예를 들어 카메라뷰 와 객체가 모두 정적이거나 객체가 이미 낮은 폴리곤 수를 사용하는 경우)
LOD는 실시간으로 사용할 수 있도록 메시 데이터를 저장해야하므로 메모리 오버 헤드와 더 큰 파일 크기가 있습니다.
다음 이미지는 장면이 정적이기 때문에 LOD가 사용되지 않는 장면을 보여줍니다. 이 상황에서 플레이어에게 보이지 않는 폴리곤 제거와 같은 다른 최적화 트릭을 사용할 수 있습니다.
LOD 사용의 다른 이점은 다음과 같습니다.
- 처리해야하는 삼각형 수가 줄어들 기 때문에 성능이 향상됩니다.
- LOD는 미세삼각형이 유발하는 문제를 완화하는 데 도움이됩니다.
LOD를 사용할 때 유의해야 할 몇 가지 핵심 사항은 다음과 같습니다.
- 각 LOD 레벨 사이의 삼각형 수를 50 % 줄이는 것이 좋습니다.
- LOD가 낮은 오브젝트에 삼각형의 밀도가 높은 영역을 사용하지 마십시오. 개체가 가까이있을 때만 표시됩니다.
- 카메라와 다른 거리에서 LOD가 어떻게 보이는지 확인합니다. 낮은 LOD는 가까이에서 볼 때 해상도가 낮다는 것을 의미하지만 카메라에서 더 멀리있는 물체에는 괜찮습니다.
다음 이미지는 각 수준에 대해 다각형 수가 50 % 감소 할 때 개체가 어떻게 보이는지 보여줍니다.
낮은 LOD 오브젝트에서 다각형 수를 충분히 줄이지 않으면 애플리케이션의 성능에 부정적인 영향을 미칩니다. 이는 GPU가 필요한 것보다 더 많은 정점을 처리하기 때문입니다.
그러나 낮은 LOD 오브젝트에 대해 폴리곤 수를 너무 적극적으로 줄이면 오브젝트의 세부 정보가 실시간으로 표시 및 해제됩니다. 이것은 잠재적으로 사용자의 경험을 망칠 수 있습니다.
객체가 가져야하는 미리 정해진 수의 LOD가 없습니다. 그것은 물체의 크기와 중요성에 달려 있습니다. 예를 들어, 액션의 캐릭터나 레이싱 게임의 자동차는 나무와 같은 작은 배경 오브젝트보다 더 많은 LOD 레벨을 사용하는 것이 좋습니다.
LOD 레벨을 너무 적게 사용하면 성능이 향상되지 않습니다. 그리고 레벨간에 폴리곤 감소가 너무 크게 증가하면 LOD 전환 중에 발생하는 팝핑이 더 눈에 띄게됩니다. LOD 레벨을 너무 많이 사용하면 애플리케이션의 성능에 영향을 미칩니다.
또한 추가 메시를 어딘가에 저장해야하기 때문에 LOD가 많을수록 메모리 사용량이 증가하여 파일 크기가 커집니다. 그러나 가장 큰 비용은 시간입니다. 특히 각 레벨을 수동으로 생성하는 경우 더욱 그렇습니다.
Additional Geometry Best Practices
Smoothing Groups
스무딩 그룹 또는 사용자 정의 정점 법선을 사용하여 가장자리의 경도(hardness)를 정의하고 모델의 모양을 변경합니다.
스무딩 그룹은 아트 디렉션이 의도적으로 작은 폴리곤 수를 사용할 때 더 나은 음영을 만드는 데 도움이됩니다.
스무딩 그룹은 모델의 UV island(기본적으로 모델의 청크)와 베이킹 할 때 노멀 맵의 품질에 영향을 미치므로 각별히주의하십시오.
스무딩이 3D 모델에 구현 된 경우 3D 소프트웨어에서 내보내고 Unity로 가져와야합니다.
다음 이미지는 오브젝트에 적용 할 때 스무딩이 작동하는 방식을 보여줍니다.
Mesh Topology
메시 토폴로지를 사용할 때 다음 팁을 기억하십시오.
- 3D Asset을 생성 할 때 토폴로지를 적절하고 깔끔하게 유지하십시오.
- 깨끗한 토폴로지는 변형되거나 애니메이션되는 캐릭터 및 개체에 필수적입니다.
- 완벽한 토폴로지에 집착하지 마십시오. 플레이어 또는 최종 사용자는 텍스처 및 재질을 적용한 후에 3D 모델의 와이어 프레임을 볼 수 없습니다.
Shape Exaggeration (과장된 모양)
모양 과장에는 가독성을 높이기 위해 개체의 특정 부분을 평소보다 크게 만드는 것이 포함됩니다. 이것이 게임에 적합한 접근 방식인지 여부는 제작중인 게임 스타일에 따라 다릅니다. 휴대 기기 화면은 작기 때문에 특정 모양이 작으면 캡처하기 어려울 수 있습니다.
모양을 과장하면이를 극복하는 데 도움이됩니다.
예를 들어 캐릭터의 손을 더 크게 만들어 작은 화면에서 더 쉽게 볼 수 있도록합니다.
다음 이미지는 과장된 손 모양을 보여줍니다. 손, 검, 신체 비율은 모두 다른 방식으로 강조됩니다. 이것은 낮은 다각형 수를 고려하면서 가시성을 향상시키기 위해 수행되었습니다.
Combining Meshes
렌더링에 필요한 드로 콜 수를 줄이려면 Mesh.CombineMeshes() 메서드를 사용하여 여러메시를 하나로 결합 할 수 있습니다 . 메시가 모두 동일한 머티리얼을 공유하는 경우 mergeSubMeshes 인수를 true로 설정 하여 결합된 그룹의 각 메시에서 단일 하위 메시를 생성합니다.
여러 메시를 하나의 큰 메시로 결합하면 다음과 같은 이점이 있습니다.
- 더 효과적인 occluder를 만듭니다.
- 타일기반 Asset을 크고 seamless한 솔리드자산으로 전환하세요.
이 기술을 적용하려면 :
- Hierarchy에 빈 게임 오브젝트를 생성하고 결합하려는 메시의 부모로 만듭니다.
- Mesh.CombineMeshes()를 구현하는 스크립트를 부모 GameObject에 연결합니다.
씬 구성에 따라 이 방법을 구현하면 성능 최적화에 유용 할 수 있습니다. 큰 메시는 작은 메시보다 더 오래 뷰에 머무르는 경향이 있으므로 정확한 크기를 얻기 위해 실험하십시오.
Model Settings
- 애니메이션되지 않는 FBX 메시 모델에서 애니메이션 데이터를 가져 오지 마십시오 : 애니메이션 데이터가 포함되지 않은 FBX 메시를 가져올 때 가져 오기 설정의 Rig 탭에서 애니메이션 유형 을 없음 으로 설정하십시오. 메시를 계층 구조에 배치 할 때이 설정은 Unity가 사용하지 않는 Animator 컴포넌트를 생성하지 않도록합니다.
- 메시 read/write 방지 : 모델이 런타임에 수정되면 Unity는 원본을 보존하면서 수정할 수 있도록 메시 데이터의 사본을 메모리에 보관합니다. 런타임에 모델이 수정되지 않은 경우 가져 오기 설정의 모델 탭에서 read/write enable 옵션을 비활성화하여 복사본이 생성되지 않도록합니다.
- 정적/동적 배치 : 정적 배치는 드로우 콜 수를 줄이는 일반적인 최적화 기술입니다. 렌더링 중에 이동, 회전 또는 크기 조정되지 않는 많은 수의 정점으로 구성된 오브젝트에 이상적입니다. 정점이 더 적은 오브젝트 및 배치 된 오브젝트에 대한 동적 배치는 렌더링 중에 이동, 회전 또는 크기 조정되지 않아야합니다. Static Batching을 활성화하려면 Inspector에서 Static 을 선택합니다. 동적 일괄 처리는 이동하고 정점이 더 적은 오브젝트를위한 것입니다.
Texture 관련
Texture Size
텍스처의 크기를 바꿀 수 있습니다. 디테일이 덜 필요한 텍스처의 크기를 줄이면 대역폭을 줄이는 데 도움이됩니다. 예를 들어, diffuse 텍스처는 1024x1024로 설정되고 관련 거칠기/metalic 맵은 512x512로 설정 될 수 있습니다.
텍스처 크기를 선택적으로 줄이도록 최선을 다하고 나중에 시각적 퀄리티가 저하되었는지 항상 확인하십시오.
Texture Color Space
Adobe Photoshop 및 Substance Painter와 같은 대부분의 텍스처링 소프트웨어는 sRGB 색상 공간을 사용하여 텍스처와 함께 작동하고 내 보냅니다. sRGB 색상 공간에서 diffuse텍스처를 사용하는 것이 좋습니다. Color로 처리되지 않은 텍스처는 sRGB 색상 공간에 있으면 안됩니다. 이러한 텍스처의 예로는 메탈릭, 러프 니스, 노멀 맵이 있습니다. 맵은 색상이 아닌 데이터로 사용되기 때문입니다. 이 맵에서 sRGB를 사용하면 머티리얼에 잘못된 시각 효과가 나타납니다.
참고 : Inspector 창의 sRGB (color texture)설정에 거칠기, 반사광, 노멀맵 또는 유사한 항목 옆에 체크 표시가 없는지 확인하십시오.
다음 스크린 샷은 sRGB가 텍스처에 잘못 적용될 때 어떤 일이 발생하는지 보여줍니다.
Texture Compression
TGA 또는 PNG와 같은 형식을 사용하여 텍스처를 내보내는 것이 일반적입니다. 이러한 형식은 사용하기 더 편리하고 주요 이미지 소프트웨어 프로그램이 지원하지만, 특수한 이미지 형식에 비해 액세스 및 샘플링 속도가 느리기 때문에 최종 렌더링에 사용해서는 안됩니다. Android의 경우, Adaptive Scalable Texture Compression (ASTC), Ericsson Texture Compression (ETC) 1 또는 ETC2와 같은 몇 가지 옵션이 있습니다.
Arm에서 만든 ASTC 기술을 사용하는 것이 좋습니다.
- ASTC는 더 많은 메모리를 요구하지 않고 ETC보다 더 나은 품질을 제공합니다.
- ASTC는 ETC보다 인코딩하는데 더 오래 걸리며 게임 패키징 프로세스에 더 많은 시간이 소요될 수 있습니다. 이것이 문제라면 게임의 최종 패키징에 ASTC를 사용하는 것이 좋습니다.
- ASTC를 사용하면 블록 크기를 설정할 수 있으므로 품질을 더 잘 관리 할 수 있습니다. 블록 크기에 가장 적합한 단일 기본값은 없지만 5x5 또는 6x6으로 설정하는 것이 좋은 시작점입니다.
게임을 빠르게 배포해야하는 경우 개발에 ETC를 사용하는 것이 더 나을 수 있습니다. 빠른 압축 설정과 함께 ASTC를 사용하여 배포 시간 증가를 피할 수 있습니다. 인코딩 할 때 속도, 품질 및 크기간에 균형이 있습니다. 최종 빌드의 경우 ASTC는 시각적 품질 및 파일 크기 측면에서 가장 좋은 옵션입니다.
Unity는 게임을 패키징 할 때 텍스처 압축을 처리하지만 ASTC와 ETC 중에서 선택할 수 있습니다.
다음 스크린 샷은 Unity에서 Android 패키지를 빌드 할 때 ASTC를 선택하는 위치를 보여줍니다.
다음 이미지는 ETC 및 ASTC 압축을 사용할 때 품질과 파일 크기의 차이를 보여줍니다.
Texture Atlas
텍스처 아틀라스는 함께 압축된 여러 작은 이미지의 데이터를 포함하는 이미지입니다.
하나의 메시에 하나의 텍스처를 사용하는 대신 텍스처 아틀라스를 사용하면 여러 메시가 사용하는 더 큰 텍스처를 가질 수 있습니다.
에셋을 만들기 전에 텍스처 아틀라스를 만들 수 있습니다. 즉, 텍스처 아틀라스에 따라 에셋을 UV 언래핑해야합니다. 텍스처를 만들 때 초기 계획이 필요합니다.
텍스처 아틀라스는 페인팅 소프트웨어에서 텍스처를 병합하여 자산이 완료된 후에도 생성 할 수 있습니다.
그러나 이것은 또한 텍스처 맵에서 연결된 폴리곤 그룹 인 UV island를 텍스처에 따라 재배열해야 함을 의미합니다.
다음 이미지는 하나의 텍스처 세트를 사용하는 3D 오브젝트를 강조합니다.
텍스처 아틀라스를 사용하면 동일한 텍스처 아틀라스와 동일한 머티리얼을 공유하는 여러 정적 오브젝트에 대한 일괄 처리를 사용할 수 있습니다. 일괄 처리는 드로우콜 수를 줄입니다. 드로우콜이 적을수록 게임이 CPU 바운드일 때 성능이 향상됩니다.
Unity에는 게임 오브젝트가 static으로 표시 될 때 오브젝트를 일괄 처리하는 기능이 있습니다. 이것은 개체를 수동으로 병합 할 필요없이 수행됩니다. 이에 대한 자세한 내용은 Unity 문서에서 찾을 수 있습니다 .
텍스처 아틀라스는 함께 packing되기 때문에 게임 내에 더 적은 텍스처가 필요해집니다. 압축을 사용하면 텍스처의 메모리 비용을 줄이는 데 도움이됩니다.
Texture Filtering
텍스처 필터링은 종종 씬의 텍스처 품질을 향상시킵니다. 텍스처 필터링이 없으면 앨리어싱과 같은 아티팩트로 인해 텍스처가 고르지 않게 보일 수 있습니다. 텍스처 필터링은 종종 텍스처를 선명하게하고 앨리어싱을 제거하는 데 사용됩니다.
그러나 더 나은 텍스처 품질을 얻으려면 종종 더 많은 처리가 필요하기 때문에 텍스처 필터링은 성능을 저하시킬 수도 있습니다. 텍스처 필터링은 때때로 GPU 에너지 소비의 최대 절반을 차지할 수 있습니다. 더 간단하고 적절한 텍스처 필터를 선택하면 애플리케이션의 에너지 수요를 줄일 수 있습니다.
- Nearest/Point filtering : 가장 간단하고 계산적으로 가장 집약적 인 텍스처 필터링 형태이지만, 가까이에서 보았을 때 가장 nearest/포인트 필터링으로 텍스처가 고르지 않게 보일 수 있습니다.
- Bilinear filtering : 이중 선형 필터링은 텍스처의 색상 픽셀에 대해 인접한 텍셀을 샘플링하고 평균화합니다. 가장 가까운 필터링과 달리 이중 선형 필터링은 픽셀이 부드러운 그라데이션을 갖기 때문에 덜 블록화 된 픽셀을 생성합니다. 이중 선형 필터링의 부작용은 텍스처가 가까이에서 볼 때 흐릿하게 보인다는 것입니다.
- Trilinear filtering : 삼선형 필터링은 이중선형 필터링과 비슷하지만 밉맵 수준 간의 혼합이 추가됩니다. 삼선형 필터링은 전환을 부드럽게하여 밉맵 간의 눈에 띄는 변화를 제거합니다.
- Anisotropic filtering : 비등방성 필터링은 지면 수준 텍스처에 이상적인 각도에서 볼 때 텍스처를 더보기 좋게 만듭니다.
(참고 : 이중선형 및 삼선형 필터링에는 더 많은 픽셀을 샘플링해야하므로 더 많은 계산이 필요합니다.)
다음 텍스처 필터링 팁을 시도하는 것이 좋습니다.
- 성능과 시각적품질 간의 균형을 위해 이중선형 필터링을 사용합니다.
- 이중선형 필터링보다 더 많은 메모리 대역폭이 필요하므로 삼선형 필터링을 선택적으로 사용하십시오.
- 삼선형 및 1x비등방성 대신 이중선형 및 2x비 등방성 필터링을 사용하십시오. 둘 다 더 잘 보이고 성능을 발휘할 수 있기 때문입니다.
- 비등방성 수준을 낮게 유지하십시오. 중요한 게임 자산에는 2보다 높은 레벨 만 사용하십시오.
Mipmapping
밉맵은 점점 더 낮은 해상도로 저장되는 텍스처의 복사본입니다. 밉 매핑은 디테일 수준 (LOD)과 동일하지만 텍스처에 해당한다고 생각하십시오.
밉맵이있는 텍스처가 렌더링 될 때 픽셀조각이 화면 공간에서 차지하는 텍스처 공간의 양에 따라 샘플링에 적합한 레벨이 선택됩니다. 오브젝트가 카메라에서 멀어지면 저해상도 텍스처가 적용됩니다. 물체가 카메라에 더 가까울 때 고해상도 텍스처가 적용됩니다.
밉 매핑은 GPU가 카메라에서 멀리 떨어진 물체에 대해 전체 해상도 텍스처를 렌더링 할 필요가 없기 때문에 모바일 애플리케이션의 성능과 품질을 모두 향상시킵니다.
또한 밉 매핑은 텍스처 앨리어싱을 줄여 최종 이미지 품질을 향상시킵니다. 텍스처 앨리어싱은 아래 이미지와 같이 카메라에서 더 먼 영역에 깜박임 효과를 발생시킵니다.
Unity는 텍스처를 임포트 할 때 필요하므로 자동으로 밉맵을 생성 한 다음 POT가 아닌 텍스처의 크기를 조정합니다. 텍스처 임포트에 대한 자세한 정보는 Unity 문서에서 확인할 수 있습니다.
Best Practices for UV Unwrapping
UV 맵은 3D 모델의 표면에 2D 텍스처를 투영합니다. UV 언 래핑은 UV 맵을 만드는 과정입니다. 래핑되지 않은 텍스처의 개별 단위 인 UV 아일랜드를 가능한 한 똑바로 유지하는 것이 가장 좋습니다.
UV 아일랜드를 가능한 한 직선으로 유지하면 다음과 같은 이점이 있습니다.
- UV 아일랜드를 더 쉽게 포장하고 공간 낭비를 줄일 수 있습니다.
- 직선 UV는 텍스처에 대한 계단 효과를 방지하는 데 도움이됩니다.
- 모바일 플랫폼에서는 텍스처 공간이 제한됩니다. 따라서 텍스처 크기는 일반적으로 콘솔이나 PC보다 작습니다. 좋은 UV 패킹은 텍스처에서 최고의 해상도를 얻을 수 있도록합니다.
- 더 나은 품질의 텍스처를 위해 UV를 똑바로 유지하여 약간 왜곡 된 UV를 고려하십시오.
UV Seams
UV Seams을 가리는 곳에 배치하십시오. 눈에 보이는 텍스처 이음새가 모델에서 나빠 보일 수 있습니다. 그렇게하면 가장자리가 매끄럽고그 사이에 작은 공간만 있는 분할 UV 아일랜드를 얻을 수 있습니다. 이것은 또한 베이킹 과정을 통해 더 나은 노멀 맵을 만드는 데 도움이 될 수 있습니다.
다음 이미지는 UV 언래핑을 사용하여 텍스처 공간을 최대화하는 방법의 예를 보여줍니다.
시각적 효과를위한 최적화
텍스처를 만들 때 포함하는 디테일은 해당 디테일의 시각적퀄리티에 비례해야합니다. 즉, 볼수있는 디테일만 작성해야합니다.
핸드폰화면은 작기 때문에 세밀한 디테일이 보이지 않습니다. 텍스처를 만들 때 이것을 고려하십시오. 예를 들어 방 구석에서 거의 보이지 않는 의자에 대해 많은 세부 사항이있는 4K 텍스처가 필요하지 않습니다.
다음 스크린 샷에서 왼쪽의 작은 256x256 픽셀 텍스처는 샘플 씬의 군인 캐릭터에 사용할 낮은 수준의 디테일을 가지고 있습니다. 오른쪽의 큰 이미지는 전체 씬을 보여주고 낮은 수준의 텍스처 디테일로 충분 함을 보여줍니다.
어떤 경우에는 모양 가독성을 높이기 위해 가장자리와 음영을 과장하고 강조 표시해야합니다.
모바일 플랫폼은 일반적으로 더 작은 텍스처를 사용하기 때문에 그 작은 공간 내에서 필요한 모든 디테일을 캡처하기 어려울 수 있습니다.
모바일 애플리케이션의 경우 더 적은 수의 텍스처를 사용하고 추가 세부 사항을 하나의 텍스처로 굽습니다.
이는 다음과 같은 이유로 중요합니다.
- 폰 화면은 작고 일부 디테일은 diffuse텍스처 자체에 베이킹하여 디테일이 보이도록하는 것이 좋습니다.
- amibent occlusion및 작은 반사 하이라이트와 같은 요소를 베이킹한 다음 diffuse텍스처에 추가 할 수 있습니다.
이 접근 방식은 반사 하이라이트 및 주변 폐색을 얻기 위해 계산 비용이 많이 드는 셰이더 및 Unity 기능에 너무 많이 의존 할 필요가 없음을 의미합니다. 다음 스크린 샷은 텍스처에 구운 세부 정보를 보여줍니다.
가능하면 셰이더에서 color tinting을 허용하는 그레이스케일텍스처를 사용하십시오. 이렇게 하면 틴팅을 수행하기 위해 커스텀 셰이더를 만드는 비용으로 텍스처 메모리가 절약됩니다.
이 방법을 사용하면 모든 개체가 좋아 보이는 것은 아니므로 선택적으로 하십시오. 균일한 색상을 가진 개체에 적용하는 것이 더 쉽습니다. RGB 마스크를 사용한 다음 마스크의 색상 범위를 기반으로하는 텍스처를 적용 할 수도 있습니다.
다음 이미지는 색조 기둥에 적용된 회색조 텍스처를 보여줍니다.
Texture Channel Packing
텍스처 채널을 사용하여 여러 텍스처를 하나로 묶습니다.
텍스처 채널 패킹은 세 개의 맵을 하나의 텍스처로 얻을 수 있으므로 텍스처 메모리를 절약하는 데 도움이됩니다. 이는 텍스처 샘플러가 적다는 것을 의미합니다. 텍스처 패킹은 일반적으로 거칠기, 부드러움 및 / 또는 금속을 하나의 텍스처로 패킹하는 데 사용됩니다. 또한 모든 텍스처 마스크에 적용 할 수 있습니다.
녹색 채널을 사용하여 가장 중요한 마스크를 저장하십시오. 녹색 채널은 일반적으로 눈이 녹색에 더 민감하고 파란색에 덜 민감하기 때문에 더 많은 비트를 가지고 있습니다.
다음 이미지는 사용 가능한 각 색상 채널에서 주변 폐색, 거칠기 / 부드러움 및 금속 데이터를 모두 하나의 파일로 압축하는 텍스처의 예를 보여줍니다.
Alpha Channel Best Practices
텍스처에 알파 채널을 추가 할 때 선택하는 것이 중요합니다. 투명도를 추가하면 텍스처가 32 비트형식으로 변환되어 메모리 사용량이 증가하므로 텍스처의 파일 크기가 커지는 경우가 많습니다.
알파 채널을 저장하는 또 다른 방법은 거칠기 또는 금속 질감에 추가 채널을 사용하는 것입니다. Unity에서 이러한 유형의 텍스처는 거칠기 (G)와 메탈릭 (B)의 3 개 채널 중 2 개를 사용하여 (R) 채널을 자유롭게 사용할 수 있습니다.
프리채널을 사용하여 알파 마스크를 저장하면 확산 텍스처를 16비트로 유지하고 파일 크기를 효과적으로 절반으로 줄일 수 있습니다. 앰비언트오클루전맵은 일반적으로 디퓨즈맵에서 구울 수도 있습니다.
다음 이미지는 자체 알파 채널에 저장하는 대신 텍스처의 빨간색 채널에 불투명 맵을 저장하는 방법을 보여 주며, 여분의 빨간색 채널을 효과적으로 사용하여 메모리를 절약합니다.
Normal Map Best Practices
노멀맵을 사용하는 것은 3D 개체가 더 자세하게 보이도록 만드는 좋은 방법입니다. 노멀맵은 주름이나 볼트와 같은 디테일을 추가하는 데 가장 적합하며 그렇지 않으면 모델링에 많은 삼각형이 필요합니다. 노멀 매핑 사용여부는 게임유형과 아트방향에 따라 다릅니다.
노멀 맵을 사용하면 적은 비용이 듭니다.
- 노멀 맵은 추가 텍스처로, 더 많은 텍스처 가져 오기를 의미하므로 더 많은 메모리가 사용됩니다.
- 저가형 장치를 대상으로 할 때는 노멀맵을 조금만 사용해야합니다.
이러한 비용에도 불구하고 노멀 맵을 사용하여 장면의 삼각형 수를 크게 줄일 수 있다면 성능이 향상 될 수 있습니다. 다음 이미지는 디테일을 위해 노멀맵과 텍스처를 사용하는 방법을 보여줍니다.
Normal Map Baking Best Practices
케이지를 사용하면 베이킹하는 표면에 관계없이 고품질 노멀 맵을 얻을 수 있습니다.
메쉬 케이지는 기본적으로 폴리곤 수가 적은 모델의 더 큰 pushed-out 버전입니다. 케이지는 종종 노멀 맵 베이킹 중에 사용되는 레이캐스트 거리를 제한하는 데 사용됩니다. 케이지는 아래에 설명 된 것처럼 노멀 맵에서 분할 노멀 이음새 문제를 해결할 수도 있습니다.
대부분의 노멀 매핑 소프트웨어는 케이지를 자동으로 만들 수 있습니다. 그러나 로우 폴리곤 모델을 복사 한 다음 배율을 약간 늘려서 만들 수 있습니다.
케이지를 사용하면 프로그램이 베이킹 할 때 법선을 계산하는 데 사용되는 방향을 변경할 수 있습니다. 이렇게하면 다음 이미지에서 볼 수 있듯이 분할 노멀 및 하드 에지에서 훨씬 더 나은 결과를 얻을 수 있습니다.
베이킹 소프트웨어에서 지원하는 경우 메시이름을 일치시켜 잘못된 노멀 맵 투영을 만드는 문제를 완화합니다. 다음 이미지의 로봇 부분과 같이 물체가 너무 가까이 있으면 예기치 않게 노멀 맵이 잘못된 얼굴에 투영 될 수 있습니다. 메시 이름을 일치 시키면 이름이 일치하는 표면에서만 베이킹이 수행됩니다.
이 솔루션은 때때로 앰비언트 오클루전을 위해 별도의 베이킹이 필요할 수 있습니다. 즉, 연속 UV는 가시적인 이음새를 유발하므로 단단한 가장자리에서 UV를 분할해야합니다. 일반적인 규칙은 각도를 90도 미만으로 유지하거나 다른 스무딩 그룹으로 설정하는 것입니다. 삼각형의 다른 스무딩 그룹과 UV 이음새를 일치시킵니다.
다음 이미지는 UV의 끊김이 단단한 가장자리에서 어떻게 보이는지 보여줍니다.
Editing Texture Settings
다음은 텍스처 설정 편집을 위한 몇 가지 팁입니다.
- Texture Type을 사용하면 Texture Type을 제어하여 텍스처가 엔진 내에서 다른방식으로 사용되도록 할 수 있습니다.
- Texture Shape를 사용하면 일부 텍스처 유형에 대해 2D 대신 큐브 맵을 선택할 수 있습니다.
- Texture Type에 따라 두 가지 추가 설정이 나타납니다.
- Texture Settting 에는 필요에 따라 작동하도록 텍스처에 대한 특정 컨트롤이 있습니다.
- Advenced Settting 은 sRGB , Alpha Source , Alpha Is Transparent , Read / Write Enabled 및 Generate Mip Maps를 포함 합니다.
- Wrap Mode는 텍스처가 UV를 감싸는 방식을 제어합니다. 옵션은 다음과 같습니다.
- Repeat 은 텍스처를 타일링하고 반복 패턴에 사용됩니다.
- Clamp 는 텍스처를 가장자리의 마지막 픽셀에 고정합니다.
- Mirror 는 반복처럼 작동하지만 텍스처의 다른 모든 반복을 미러링합니다.
- Mirror Once 는 텍스처를 가장자리 픽셀에 고정하기 전에 한 번 미러링합니다.
- Filter Mode는 텍스처에 사용되는 필터를 제어합니다.
- Texture Compression 상자를 사용하면 최대 크기, 크기 조정 알고리즘, 형식, 압축, 및 사용 위기 압축을 제어 할 수 있습니다.
ASTC 압축 설정
ASTC는 고품질, 낮은 비트 레이트 텍스처 압축을 제공하며 다양한 제어 옵션을 제공합니다. 다음 기능이 포함됩니다.
- Bit rate는 픽셀 당 8bpp에서 1bpp미만까지 다양합니다. 이를 통해 품질에 대한 파일 크기의 균형을 미세 조정할 수 있습니다.
- 1~4 개의 색상 채널을 지원합니다.
- LDR (Low Dynamic Range) 및 HDR (High Dynamic Range) 이미지를 모두 지원합니다.
- 2D 및 3D 이미지 지원.
- 다양한 기능 조합 선택 지원.
ASTC 설정 창에서 사용할 수있는 여러 블록 크기 옵션이 있습니다. 이러한 옵션 중에서 선택하고 자산에 가장 적합한 블록 크기를 선택할 수 있습니다. 블록 크기가 클수록 압축률이 높아집니다. 카메라에서 멀리 떨어진 물체와 같이 매우 자세하게 표시되지 않는 텍스처에는 큰 블록 크기를 선택하는 것이 가장 좋습니다. 더 작은 블록 크기는 카메라에 더 가까운 것과 같이 더 자세하게 표시되는 텍스처에 가장 적합합니다.
(참고 : 장치가 ASTC를 지원하는 경우 이를 사용하여 3D 콘텐츠의 텍스처를 압축하십시오. 장치가 ASTC를 지원하지 않는 경우 ETC2를 사용해보십시오. 또한 3D 콘텐츠에 사용되는 텍스처와 GUI 요소에 사용되는 텍스처를 구분해야합니다. 어떤 경우에는 원하지 않는 아티팩트를 피하기 위해 GUI 텍스처를 압축하지 않은 상태로 두는 것이 가장 좋습니다.)
ASTC 텍스처에 대한 올바른 형식 선택
ASTC 텍스처를 압축 할 때 선택할 수있는 여러 옵션이 있습니다.
텍스처 압축 알고리즘에는 일반적으로 RGB 및 RGBA와 같은 다른 채널 형식이 있습니다. ASTC는 여러다른 형식을 지원하지만 이러한 형식은 Unity 내에서 노출되지 않습니다. 각 텍스처는 일반적으로 표준 텍스처링, 노멀 매핑, 스페 큘러, HDR, 알파 및 룩업 텍스처와 같은 다양한 용도로 사용됩니다. 이러한 모든 텍스처 유형에는 최상의 결과를 얻기 위해 다른 압축 형식이 필요합니다.
다음 그림은 가져 오기 설정의 일부 텍스처 유형을 보여줍니다.
빌드 설정에서 하나의 형식으로 모든 텍스처를 압축하지 않는것이 가장 좋습니다. 좋은 방법은 텍스처 압축을 Do n't Override 로 유지하는 것 입니다.
Unity는 일반적으로 Texture 유형으로 Texture를 가져옵니다 . 이 유형은 제한된 압축옵션을 제공합니다. 더 많은 옵션을 표시 하려면 유형을 고급으로 설정하십시오 .
다음 이미지는 투명도가 있는 GUI 텍스처에 대한 설정을 보여줍니다.이 텍스처는 GUI 용이므로 sRGB 및 밉맵이 비활성화됩니다. 투명성을 포함하고 알파 채널에 대한 액세스 권한을 얻으려면 Alpha Is Transparency and Override for Android 상자를 선택할 수 있습니다.
Block Sizes
형식과 블록 크기를 선택하는 옵션이 있습니다. RGBA에는 알파 채널이 포함되며 4x4는 선택할 수 있는 가장 작은 블록 크기입니다.
모든 텍스처에 대한 특정 설정을 선택하면 프로젝트의 시각적 품질을 개선하고 압축시 불필요한 텍스처 데이터를 피할 수 있습니다.
다음 표는 RGBA (채널당 8 비트) 형식을 사용하는 4MB, 1024x1024 텍스처에 대해 Unity에서 사용 가능한 ASTC 블록 크기에 대한 압축 비율을 보여줍니다
'Unity > 최적화' 카테고리의 다른 글
Fixing Performance Problems - 2019.3 (0) | 2021.03.22 |
---|---|
Arm & Unity Presents: 3D Art Optimization for Mobile Applications - Shaders, Materials, Lighting (0) | 2021.03.19 |
Optimizing Unity UI (Unity UI 최적화) (0) | 2021.03.16 |
[Youtube] Unite '17 Seoul - Tips and Tricks for Optimising Unity UI (0) | 2021.03.11 |
[Youtube] Dev Weeks: 작업 효율을 높이기 위한 유니티 UI 제작 프로그래밍 패턴들 (0) | 2021.03.10 |
- Total
- Today
- Yesterday