게임 텍스처를 게임 내에서 제대로 렌더링하려면 특정한 요구 사항을 충족해야 합니다. 포트나이트 언리얼 에디터(Unreal Editor for Fortnite, UEFN)에서 임포트된 이미지로 텍스처를 제작하는 경우, 소스 이미지 파일의 높이와 너비에 2의 거듭제곱을 사용해야 합니다. 이를 통해 여러 플랫폼에서 섬의 호환성과 안정성을 향상할 수 있습니다.
그래픽 처리 장치(Graphics Processing Units, GPU)를 위한 압축 파일 포맷은 모든 콘솔, PC, 모바일에서 높이와 너비가 2의 거듭제곱인 텍스처를 사용해야 합니다. 2의 거듭제곱 규칙을 따르지 않는 텍스처는 저사양 플랫폼에서 안정성이 떨어지며, 게임 크래시를 유발할 수 있습니다. 2의 거듭제곱은 저메모리 플랫폼에서 낮은 텍스처 해상도로 텍스처를 스트리밍하는 경우에도 사용됩니다.
텍스처 스트리밍은 다음과 같은 경우 도움이 됩니다.
텍스처의 해상도를 변경하는 경우
게임 로드 속도를 결정하는 경우
게임의 비주얼 퀄리티를 높이려는 경우
GPU 메모리를 절약하려는 경우
2의 거듭제곱이란
컴퓨터와 콘솔은 모든 데이터를 한꺼번에 관리 및 처리하는 것이 아니라, 제한된 청크로 관리 및 처리합니다. 이러한 원리는 월드 파티션을 사용하여 배경이 렌더링되는 방식과 유사합니다.
게임 데이터의 청크가 2의 거듭제곱 규칙을 준수하는 경우, 데이터 청크는 미디어에서 하드코딩된 물리적 제한 사항을 설정합니다. 이러한 제한 사항을 준수하지 않으면 게임 엔진은 에셋을 적절하게 렌더링하려고 시도하는 과정에서 리소스를 낭비하게 됩니다.
2의 거듭제곱은 비주얼 경험을 효율적으로 표시하여 게임 데이터를 최적화하고 이미지를 렌더링하는 방법입니다.
허용되는 이미지 크기의 예로 256x256, 512x512 또는 1024x2048이 있습니다. 2의 거듭제곱을 사용하지 않는 텍스처는 최적화되지 않으며, 불안정성과 섬 퍼포먼스 저하를 모두 초래합니다.
UEFN에서는 2의 거듭제곱 텍스처에 다음과 같은 3가지의 주요 기능을 사용할 수 있습니다.
텍스처 압축: 최소한의 비주얼 비용으로 메모리 크기를 약 8배 줄입니다.
밉매핑: 저해상도 베리언트가 자동으로 생성됩니다.
텍스처 스트리밍: 고해상도 데이터를 메모리에 스트리밍하기 전에 저해상도 베리언트를 먼저 표시합니다.
이러한 기능이 결합되면 어떤 플랫폼에서든 4K 텍스처가 사용된 고퀄리티 에셋을 렌더링할 수 있습니다. 이는 텍스처가 낮아진 해상도에서 고퀄리티 베리언트를 보유하게 되기 때문입니다.
예를 들어, 알파 레이어가 없는 4000x4000 텍스처에는 64MB의 메모리가 필요합니다. 이러한 텍스처는 한꺼번에 로드되며, 플레이어와 멀리 떨어진 작은 게시판에서 에일리어싱 현상을 유발하더라도 계속해서 4000x4000으로 표시됩니다. 텍스처 크기가 너무 크면 메모리가 충분하지 않은 장치에서 크래시가 발생할 수 있습니다.
이에 대조적으로, 기본 압축을 사용하는 텍스처의 4096x4096 버전은 8MB밖에 소모하지 않으므로 계속해서 스트리밍할 수 있으며 원거리에서 더 적은 에일리어싱 현상을 유발합니다. 텍스처 크기가 너무 크면 패키지 크기도 증가하지만, 이는 게임플레이에서 크래시를 유발하지는 않습니다.
텍스처 유효성 검사
텍스처를 프로젝트에서 사용하기 전에 퍼포먼스에 대한 유효성 검사를 수행해야 합니다. 텍스처의 유효성 검사를 수행하지 않으면 다음과 같은 문제가 발생하게 됩니다.
너무 큰 소스 텍스처로 인한 메모리 부족 크래시
너무 큰 쿠킹된 텍스처로 인한 플랫폼 크래시
부적절한 텍스처로 인한 플랫폼 퍼포먼스 문제
유효성 검사를 통과하지 못한 텍스처가 있으면 프로젝트를 퍼블리싱할 수 없습니다.
유효성 검사 규칙
유효성 검사 규칙에는 모든 에셋에 적용되는 보편적 규칙과 텍스처에만 적용되는 세 가지 주요 규칙이 있습니다.
보편적 규칙
소스 치수는 4096텍셀보다 클 수 없습니다.
UI의 2D 텍스처
1,048,576텍셀(1024 X 1024) 미만의 쿠킹된 텍스처는 자동으로 유효성 검사를 통과합니다.
2D 텍스처
1,048,576텍셀(1024 X 1024) 미만의 쿠킹된 텍스처는 자동으로 유효성 검사를 통과합니다.
쿠킹된 치수는 2048텍셀보다 클 수 없습니다.
쿠킹된 치수는 2의 거듭제곱이어야 합니다.
스트리밍 및 밉 생성이 가능해야 합니다.
큐브맵 텍스처
1,048,576텍셀 미만의 쿠킹된 텍스처(페이스당)는 자동으로 유효성 검사를 통과합니다.
쿠킹된 치수는 1024텍셀보다 클 수 없습니다. 이는 에셋이 아닌 페이스를 기준으로 합니다.
쿠킹된 치수는 2의 거듭제곱이어야 합니다.
스트리밍 및 밉 생성이 가능해야 합니다.
유효하지 않은 텍스처 찾기
UEFN에서는 임포트된 모든 텍스처가 적절한 크기 제약을 사용하도록 하기 위해 텍스처에 대해 엄격한 크기 요구 사항이 있습니다. UEFN에는 포트나이트에서 제공하는 것 외에 추가 유효성 검사 툴이 포함되어 있습니다. 이러한 유효성 검사 툴은 규칙을 사용하여 제작 프로세스 초기에 문제를 발견하고 표면화하여, 필연적으로 쿠킹에 실패하는 프로젝트를 업로드하지 못하도록 합니다.
텍스처의 유효성 검사는 프로젝트 유효성 검사 프로세스 중에 그리고 콘텐츠 브라우저에 추가할 때 수행합니다.
프로젝트 유효성 검사
텍스처의 유효성 검사 오류는 프로젝트가 유효성 검사 프로세스를 거친 후 표시됩니다. 프로세스에서는 항상 (에셋 태그가 아닌) 실제 텍스처 데이터를 사용합니다. 모든 결과는 '자동 수정' 토큰과 함께 메시지 로그에 출력됩니다.
콘텐츠 브라우저 유효성 검사
텍스처의 섬네일과 툴팁에는 각각 아이콘과 요약이 표시되며, 컨텍스트 메뉴에는 '텍스처 맞추기' 옵션이 제공됩니다. 텍스처 맞추기는 실제 텍스처 데이터를 사용하려고 시도하며, 텍스처가 로드되지 않은 경우 퍼포먼스상의 이유로 에셋 태그로 예비 전환됩니다. 에셋 태그를 판독할 때 특정 태그가 없으면 정확도가 약간 떨어질 수 있습니다. 하지만 다음번에 텍스처의 실제 데이터에 대한 유효성을 검사(프로젝트 유효성 검사, OnObjectTransacted)할 때 툴팁 및 섬네일이 정확하게 업데이트됩니다.
위에 제시된 요구 사항을 준수하지 않는 텍스처 에셋은 콘텐츠 브라우저에 오류 아이콘으로 표시됩니다. 해당 에셋에 마우스 커서를 올리면 툴팁 상단에 특정 문제에 대한 자세한 내용이 표시됩니다.
텍스처 맞추기 기능을 사용하는 방법은 아래의 유효하지 않은 텍스처 맞추기 섹션을 참고하세요.
UEFN의 텍스처 크기 조절 요구 사항
모든 섬이 모든 타깃 플랫폼에서 제대로 작동하도록 UEFN에서는 텍스처 에셋에 특정 요구 사항을 적용합니다.
프로젝트에 이러한 요구 사항을 준수하지 않는 텍스처 에셋이 포함된 경우, 해당 텍스처는 유효성 검사에 실패하여 프로젝트 업로드가 차단됩니다.
텍스처가 UI 텍스처 그룹에 할당된 경우, 텍스처 치수의 최대 크기는 2048x2048 미만이어야 합니다. 하지만 텍스처 치수가 2의 거듭제곱일 필요는 없습니다. (UI 텍스처는 일반적으로 스트리밍되지 않으므로 항상 가능한 한 선명하게 표시됩니다.)
텍스처가 UI 텍스처 그룹에 할당되지 않은 경우, 텍스처 치수의 최대 크기는 4096x4096 미만이어야 합니다. 또한 최소 한계치(1024x1024, 즉 1048576)보다 더 많은 픽셀이 포함되어 있는 경우 스트리밍 가능해야 합니다. 이것이 의미하는 바는 다음과 같습니다.
각 텍스처의 치수는 2의 거듭제곱이어야 합니다(예: 256x256, 512x512, 1024x1024 등).
이미지의 각 치수가 2의 거듭제곱이기만 하다면 이미지가 정사각형일 필요는 없습니다. 예를 들면 256x512, 512x1024, 256x1024 등도 가능합니다.
텍스처의 스트림 안 함(Never Stream) 프로퍼티는 비활성화해야 합니다.
밉맵을 생성하도록 텍스처를 설정해야 합니다.
프로젝트 내 모든 비스트리밍 텍스처의 총 메모리 비용은 사전에 설정된 최대 예산 미만이어야 합니다. 프로젝트의 메모리 비용은 스트리밍 안 함 프로퍼티가 활성화된 모든 텍스처의 메모리 비용을 더해서 결정됩니다. 여기에는 다음이 포함됩니다.
치수가 2의 거듭제곱이 아니며, 패딩 및 크기 조절 프로퍼티를 사용하여 2의 거듭제곱으로 패딩되거나 늘어나지 않은 모든 텍스처. 스트리밍 안 함 프로퍼티는 이러한 텍스처에서 항상 자동으로 활성화됩니다.
스트림 안 함 프로퍼티를 수동으로 활성화한 다른 모든 텍스처
모든 텍스처에는 예상되는 사용 사례를 나타내는 텍스처 그룹 세팅이 있습니다. 콘텐츠 브라우저에서 텍스처 에셋을 더블클릭하여 텍스처 에디터를 열어 이 그룹 및 위에 언급된 다른 텍스처 프로퍼티를 설정할 수 있습니다.
텍스처 크기 조절하기
UEFN에서는 치수가 균일하지 않거나 지나치게 크기가 큰 기존 임포트 텍스처를 2의 거듭제곱으로 스케일 조절할 수 있습니다. 사용할 수 없는 텍스처를 찾아 수정하려면 다음 단계를 따릅니다.
콘텐츠 드로어(Content Drawer) 또는 콘텐츠 브라우저(Content Browser)를 열고, 좌측의 파일 트리 패널에서 FortniteGame에 위치한 프로젝트의 루트 콘텐츠 폴더를 선택합니다.
All 아래에서 이름이 [프로젝트 이름] Content인 폴더를 찾습니다.
콘텐츠 드로어 상단의 검색창에
NeverStream==true&&TextureGroup!=UI를 입력합니다. 그러면 쿼리가 실행되어 영향을 받는 모든 에셋을 식별합니다.
필터링된 뷰에 표시되는 모든 에셋은 영향을 받은 에셋입니다. 수정하는 데 어느 정도의 시간이 소요되기는 하지만, 이를 통해 레벨의 퍼포먼스를 향상할 수 있습니다.
UI 그룹에 해당하지 않지만 영향을 받은 텍스처를 업데이트하는 방법은 두 가지입니다.
옵션 A는 UEFN의 대량 편집 기능으로 텍스처를 그룹화하여 한 번에 편집하는 것입니다. 올바른 종횡비로 패딩하여 텍스처를 자동으로 수정하는 가장 빠른 방법이지만, 이 패딩으로 인해 불필요한 메모리 사용이 발생할 수 있습니다.
옵션 B는 시간이 조금 더 걸리지만, 영향을 받은 텍스처를 여러 개 해결해야 하는 경우 메모리 예산을 가장 잘 활용할 수 있습니다. 이 옵션을 사용하면 불필요한 패딩을 피하기 위해 텍스처를 편집하고 다시 업로드합니다.
옵션 A
콘텐츠 브라우저에서 검색창 옆 세 줄 메뉴를 클릭하고 텍스처(Textures)를 선택합니다. 모든 텍스처가 콘텐츠 브라우저에 분리됩니다.
세팅 아이콘을 클릭하고 열(Columns)을 켭니다. 이제 모든 텍스처가 콘텐츠 브라우저의 열에 목록으로 나타납니다.
치수(Dimensions) 열에서 2의 거듭제곱 크기를 사용하지 않는 에셋을 찾습니다.
2의 거듭제곱 규칙을 따르지 않는 모든 텍스처를 선택합니다.
콘텐츠 브라우저에서 우클릭하고 에셋 액션(Asset Actions) > 프로퍼티 매트릭스에서 선택 편집(Edit Selection in Property Matrix)을 선택합니다. 이렇게 하면 컴포넌트 에디터 탭에 선택된 모든 텍스처가 항목화된 대량 편집 툴이 열립니다.
루트(Root) 섹션에서 텍스처 파일 이름을 모두 선택합니다.
이미지를 클릭하면 확대됩니다.
고정된 열(Pinned Columns) 탭에서 텍스처(Texture) 옵션을 엽니다.
패딩 및 크기 조절(Padding and Resizing) 드롭다운 메뉴에서 Pad to Power Of Two를 선택합니다. 에디터 창 하단에 프로그레스 바가 나타납니다.
텍스처가 모두 2의 거듭제곱으로 변환되어 여러 플랫폼에서 작동할 수 있게 됩니다.
옵션 B
텍스처를 더블클릭하여 텍스처 에디터를 엽니다.
디테일(Details) 패널 상단의 검색창에서 소스 파일 이름을 입력합니다. 검색 결과, 텍스처의 원본 소스 파일로 사용될 PC의 파일 경로가 표시됩니다.
이미지를 클릭하면 확대됩니다.
GIMP, Paint.NET 5 등의 이미지 에디터를 사용하여 텍스처 크기를 가장 가까운 2의 거듭제곱으로 조절합니다. 텍스처에 알파 레이어가 없는 경우 그림판도 사용 가능합니다.
2의 거듭제곱 크기에는 256, 512, 1024 등이 있습니다.
예를 들어 500x500 텍스처는 512x512, 600x256 텍스처는 512x256이 되어야 합니다.
종횡비를 변경하더라도 섬에 부정적인 영향을 미쳐서는 안 됩니다.
콘텐츠 브라우저에서 텍스처를 우클릭하고 리임포트(Reimport)를 선택합니다.
원본 텍스처 이미지가 파일에서 누락된 경우 다음을 수행합니다.
콘텐츠 브라우저에서 텍스처를 우클릭한 후 에셋 액션 > 익스포트(Export)를 선택하여 새 사본을 얻습니다.
가장 가까운 2의 거듭제곱 크기로 텍스처 크기를 조절합니다. 그런 다음 콘텐츠 브라우저에서 텍스처를 우클릭하고 새 파일로 리임포트(Reimport With New File)를 선택합니다. 파일이 임포트되면 텍스처를 더블클릭하여 텍스처 에디터를 엽니다.
디테일 패널의 검색창에 스트림 안 함을 입력한 후 옵션을 False로 설정합니다. False로 설정할 수 없는 경우, 상단의 임포트됨(Imported) 사양에서 이미지 크기가 2의 거듭제곱으로 표시되는지 확인합니다.
디테일 패널에서 밉 생성 세팅(Mip Gen Settings) 옵션을 검색합니다. 그런 다음 드롭다운 메뉴에서 FromTextureGroup을 선택합니다.
디테일 패널에서 압축 세팅(Compression Settings) 옵션을 찾은 다음, 드롭다운 메뉴에서 Default (DXT1/5)를 선택합니다.
이 단계를 완료한 후 콘텐츠 브라우저 검색창에서 NeverStream==true&&TextureGroup!=UI를 다시 검색하여 제한된 텍스처가 성공적으로 제거되었는지 확인합니다. 업데이트된 에셋은 더 이상 표시되지 않습니다.
개별 텍스처 변경하기
2의 거듭제곱 규칙을 따르지 않는 텍스처가 1개뿐인 경우, 다음 방법을 사용합니다.
텍스처를 더블클릭하여 텍스처 에디터를 엽니다.
이미지를 클릭하면 확대됩니다.
디테일 패널의 검색창에 Power of Two Mode를 입력합니다. 그런 다음 패딩 및 크기 조절 드롭다운 메뉴에서 Pad to Square Power Of Two를 선택합니다.
스트림 안 함 옵션을 찾아 False로 설정합니다.
밉 생성 세팅 옵션을 검색합니다. 그런 다음 드롭다운 메뉴에서 FromTextureGroup을 선택합니다.
압축 세팅 옵션을 찾은 다음, 드롭다운 메뉴에서 Default (DXT1/5)를 선택합니다.
이 단계를 완료한 후 콘텐츠 브라우저 검색창에서 NeverStream==true&&TextureGroup!=UI를 검색하여 제한된 텍스처가 성공적으로 제거되었는지 확인합니다. 업데이트된 에셋은 더 이상 목록에 표시되지 않습니다.
유효하지 않은 텍스처 맞추기
외부 파일에서 임포트한 유효하지 않은 텍스처를 수정하는 가장 좋은 방법은 해당 텍스처를 만드는 데 사용한 원래의 애플리케이션에서 편집한 다음, 에셋을 리임포트하는 것입니다. 또한, 또 다른 전용 이미지 편집 애플리케이션을 사용하여 텍스처를 편집한 후 UEFN에 리임포트해도 됩니다.
각 이미지의 치수가 위에 명시된 최대 치수 미만이어야 합니다. UI용 이미지를 사용하고 있지 않는 경우 이미지의 너비와 높이를 모두 2의 거듭제곱으로 만듭니다. 이미지의 각 치수가 2의 거듭제곱이기만 하다면 이미지가 정사각형일 필요는 없습니다.
대안으로 UEFN에서는 텍스처 크기를 UEFN 요구 사항에 자동으로 맞추는 기본적인 방법을 제공합니다. 방법은 다음과 같습니다.
콘텐츠 브라우저에서 하나 이상의 유효하지 않은 텍스처를 선택합니다.
텍스처 섬네일을 우클릭하고 컨텍스트 메뉴에서 텍스처 맞추기(Conform Texture)를 선택합니다.
에디터는 유효성 검사 문제를 방지하기 위해 선택한 텍스처의 프로퍼티를 조정하려 시도하고, 출력 로그에 그 결과를 작성합니다.
이 작업은 다음과 같은 효과가 있습니다.
텍스처가 UI 텍스처 그룹에 속하며 텍스처 치수가 허용된 최대 크기보다 큰 경우, 텍스처의 압축(Compression) > 고급(Advanced) > 최대 텍스처 크기(Maximum Texture Size) 세팅이 런타임 시 로드 가능한 텍스처의 최대 해상도를 제한하도록 조정됩니다.
텍스처가 UI 텍스처 그룹에 속하지 않으며 텍스처 치수가 허용된 최대 크기보다 큰 경우, 텍스처의 최대 밉맵이 폐기되도록 텍스처의 LOD 바이어스(LOD Bias) 세팅이 조정됩니다. 이는 런타임 시 로드 가능한 텍스처의 최대 해상도를 효과적으로 제한합니다.
텍스처가 UI 텍스처 그룹에 속하지 않으며 텍스처 치수가 2의 거듭제곱이 아닌 경우, 텍스처의 패딩 및 크기 조절 세팅이 Stretch To Power of Two로 설정됩니다.
텍스처가 UI 텍스처 그룹에 속하지 않는 경우 스트림 안 함 세팅이 비활성화됩니다.