Поддержка и настройка Текстуры в Unreal Engine 4

0
23
Поддержка и настройка Текстуры в Unreal Engine 4

Один из самых больших вкладов в любые области памяти цифровых проектов – это размер и количество используемых Текстур. К счастью, Unreal Engine 4 имеет очень надежную систему для неразрушающего уменьшения размера текстуры во всех ваших проектах Текстуры. На следующей странице мы рассмотрим эти системы и как их можно использовать для сокращения ваших проектов – Требования к памяти текстуры.

Разрешение Текстуры

Unreal Engine 4 поддерживает разрешение текстуры от 1 x 1 до 8192 x 8192 с небольшими изменениями в .INI-файлах. Текущие видеоадаптеры DirectX и игровые консоли поддерживают различные разрешения текстур от 1×1 до 2048 x 2048 и до 8192 x 8192. Наивысшее разрешение текстуры, поддерживаемое конкретным аппаратным устройством, зависит от производителя, модели и доступной памяти текстуры. В Unreal Engine 4 имеется ряд функций и настроек для управления разрешениями текстуры, которые отображаются для различных областей, таких как геометрия мира или пользовательский интерфейс.

Ограничение разрешения Текстуры движка

Unreal Engine 4 по умолчанию ограничивает максимальное количество текстурных шрифтов до 14, что эффективно ограничивает наибольшую отображаемую текстуру до 8192 (от 1 x 1 до 8192 x 8192 составляет 14 mips).
Это имеет побочный эффект, так что импортированные текстуры 8192 будут отображаться только до mip 1 из 4096. Константа MAX_TEXTURE_MIP_COUNT, которая по умолчанию имеет значение 13 в исходных файлах движка, может быть изменена до значения 14 для поддержки рендеринга текстуры 8192. Эта константа определяется в следующих исходных файлах (начиная с QAMar09, обязательно проверяйте другие версии QA).


Src\D3D10Drv\Src\D3D10Device.cpp
Src\Engine\Inc\RHI.h
Src\Engine\Inc\UnTex.h
Src\Engine\Src\RHI.cpp
Src\Engine\Src\TextureCube.cpp

С выпуском UE 4.8 теперь вы можете изменять свои проекты, чтобы использовать текстуры размером до 8192 без изменения кода C++, добавив в свои проекты файл DefaultEngine.INI и установив MaxLODsize на 8192.


[SystemSettings]
TEXTUREGROUP_World=(MinLODSize=1,MaxLODSize=8192,LODBias=0,MinMagFilter=aniso,MipFilter=point)

После того, как вы добавили раздел, размер которого хотите увеличить, сохраните файл и перезапустите Редактор. Когда Редактор перезапустит любые Текстуры, которые были импортированы с размером 8192, он должен показать 8192 как размер LOD 1, вместо того, чтобы быть зафиксированным до максимума 4096. В следующем примере мы изменили файл DefaultEngine.INI в Проект UE 4.8, позволяющий использовать Текстуры размером до 8192. Когда текстура T_8K_Test загружается в UE4, мы видим, что как импортированный, так и отображаемый размер текстуры составляют 8192.

T получение текстур 8K UE4

Требования к памяти сжатой Текстуры

DXT использует сжатие с потерями, основанное на упаковке пикселей в блоки 4 x 4 с цветами палитры и интерполированными цветами. Это приводит к размеру файла сжатия DXT1 и 4: 1 DXT5. Поскольку ресурсы видеопамяти и текстурного пула фиксированы для конкретной платформы и оборудования, необходимо сбалансировать баланс между разрешением текстуры и использованием ресурсов. В следующей таблице перечислены требования к текстурной памяти для текстур DXT1 и DXT5 при различных общих разрешениях с полными mips (от 1 x 1 до полного native mip 0). Обратите внимание, что требования к памяти являются почти постоянными кратными коэффициенту разрешения текстуры, и что текстуры DXT5 требуют почти вдвое больше памяти их копии DXT1.

Так как отношение разрешения к сжатию является константой, чтобы рассчитать требования к памяти для разрешения текстуры, не перечисленные здесь, просто умножьте коэффициенты разрешения. Например, текстура 1024 x 512 будет составлять половину потребностей в памяти текстуры 1024 x 1024.

Данные таблицы были собраны из текстур, созданных Compressonator от ATI, используя генерацию Mip Box-Filter и Сжатие Текстуры DirectX.

РазрешениеВсе Mips от 1 x 1DXT1DXT5
16 x 165 mips312 байт496 байт
32 x 326 mips824 байт1.48 Кбайт (1,520 байт)
64 x 647 mips2.80 Кбайт (2,872 байт)5.48 Кбайт (5,616 байт)
128 x 1288 mips10.8 Кбайт (11,064 байт)21.4 Кбайт (22,000 байт)
256 x 2569 mips42.8 Кбайт (43,832 байт)85.4 Кбайт (87,536 байт)
512 x 51210 mips170 Кбайт (174,904 байт)341 Кбайт (349,680 байт)
1024 x 102411 mips682 Кбайт (699,192 байт)1.33 MБ (1,398,256 байт)
2048 x 204812 mips2.66 MБ (2,796,344 байт)5.33 MБ (5,592,560 байт)
4096 x 409613 mips10.6 MБ (11,184,952 байт)21.3 MБ (22,369,776 байт)
8192 x 819214 mips42.6 MБ (44,739,384 байт)85.3 MБ (89,478,640 байт)

Конфигурация свойств Текстуры

Минимальный и максимальный LOD (mip), поддерживаемые для конкретной игры TextureGroups, определяются в нескольких файлах конфигурации движка.
Исходный набор файлов настроек конфигурации находится в файле [Unreal Engine 4 Install Location]\Engine\Config\BaseEngine.ini в разделе [SystemSettings].

Для разработки игр файл [your_game]\Config\DefaultEngine.ini также содержит зеркальный набор базовых свойств в папке Engine\Config\ и должен быть копией, которая обычно изменяется для определенных настроек вашей игры.

Обратите внимание, что для Unreal Editor и внутри игры существуют независимые наборы ввода TextureGroup. Эти два набора расположены соответственно в разделах [SystemSettingsEditor] и [SystemSettings] в файлах конфигурации.

Настройки ввода TextureGroup в файле BaseEngine.ini будут выглядеть примерно так. Обратите внимание, что более старые версии QA могут не включать свойства MinMagFilter и MipFilter для каждой настройки.


[SystemSettings]
; NOTE THAT ANY ITEMS IN THIS SECTION WILL AFFECT ALL PLATFORMS!!!

TEXTUREGROUP_World=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WorldNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WorldSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Character=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_CharacterNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_CharacterSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Weapon=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WeaponNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WeaponSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Vehicle=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_VehicleNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_VehicleSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Cinematic=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Effects=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point)
TEXTUREGROUP_EffectsNotFiltered=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Skybox=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_UI=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Lightmap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Shadowmap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,NumStreamedMips=3)
TEXTUREGROUP_RenderTarget=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_MobileFlattened=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Terrain_Heightmap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Terrain_Weightmap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Bokeh=(MinLODSize=1,MaxLODSize=256,LODBias=0,MinMagFilter=linear,MipFilter=linear)

Настройки TextureGroup в файле [your_game]\Config\DefaultEngine.ini обычно выглядят примерно так. Обратите внимание, что настройки LOD обычно устанавливаются на пределы диапазона, необходимые для дизайна игры и целевой платформы.


[SystemSettings]
TEXTUREGROUP_Character=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_CharacterNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_CharacterSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_Cinematic=(MinLODSize=256,MaxLODSize=4096,LODBias=0)
TEXTUREGROUP_Effects=(MinLODSize=128,MaxLODSize=512,LODBias=1)
TEXTUREGROUP_Lightmap=(MinLODSize=512,MaxLODSize=4096,LODBias=0)
TEXTUREGROUP_Shadowmap=(MinLODSize=512,MaxLODSize=4096,LODBias=0,NumStreamedMips=3)
TEXTUREGROUP_RenderTarget=(MinLODSize=1,MaxLODSize=4096,LODBias=0)
TEXTUREGROUP_Skybox=(MinLODSize=512,MaxLODSize=2048,LODBias=0)
TEXTUREGROUP_UI=(MinLODSize=512,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_Vehicle=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_VehicleNormalMap=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_VehicleSpecular=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_Weapon=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_WeaponNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_WeaponSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_World=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_WorldNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_WorldSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_MobileFlattened=(MinLODSize=8,MaxLODSize=256,LODBias=0)
r.setres=1024x768

Множество AppCompat ПК

AppCompat используется для переопределения различных Настроек Системы на основе объективных и эмпирических данных, собранных при запуске. Когда совместимость приложений включена (только для ПК), система измеряет возможности механизма, а затем перезаписывает значения Engine.ini с предустановленными значениями из одного из 5 buckets (бакетов). Смотрите BaseCompat.ini в папке Engine\Config\ для примера такого использования.

AppCompat предназначен для проверки только один раз, когда игра сначала запускается (а не редактор). Он обнаруживает это, проверяя наличие раздела [AppCompat] в [game] Engine.ini, который содержит ранее рассчитанные оценки для механизма. Если AppCompat уже был применен один раз, он не будет изменен снова, чтобы пользовательские изменения могли производиться пользователями без перезаписи каждый раз.

AppCompat специально отключен для редактора, поэтому спецификации машины не влияют на то, как активы просматриваются на разных машинах во время разработки. Это является причиной разделения между SystemSettings и SystemSettingsEditor.

Вы можете эффективно отключить AppCompat, предоставив пустую DefaultCompat.ini для своей игры, что заставляет ее инициализировать все buckets (бакеты) из [SystemSettings] в Engine.ini. В этом случае система работает точно так же, как и до AppCompat.

Свойства TEXTUREGROUP

Каждый ввод TextureGroup определяет свойства текстуры для определенного набора текстур, используемые в рендеринге игры. Группирование текстур в общие наборы позволяет лучше контролировать использование пула текстурной памяти различными ресурсами текстуры игры.

СвойствоОписание
MinLODSizeМинимальный размер mip, который будет отображаться, заданный в пикселях, от 1 до 8192 в качестве двухзначных, должен быть меньше MaxLODSize.
MaxLODSizeМаксимальный размер mip, который будет отображаться, заданный в пикселях, от 1 до 8192 в качестве мощности двух, должен быть больше, чем MinLODSize.
LODBiasОтрицательное или положительное значение, которое определяет количество уровней mip для смещения перед загрузкой для рендера, зажатых в MinLODSize и MaxLODSize.
MinMagFilterОпределяет тип фильтра текстуры, когда текстуры будут уменьшены или увеличены с помощью GPU. См. Таблицу ниже.
MipFilterУказывает, должен ли GPU смешивать два mips вместе при просмотре текстуры на расстоянии или под углом скоса. См. Таблицу ниже.
NumStreamedMipsКоличество mips, которым разрешено транслироваться внутрь или извне. Если текстура имеет 10 mips, а NumStreamedMips – 2, в нее могут входить или выходят только два самых высоких mips. Таким образом, текстура будет иметь 8 – 10 mips в памяти в любой момент времени. Установка NumStreamedMips в 0 означает, что потоки mips не будут переданы, а текстуры, использующие эту группу LOD, всегда будут полностью загружены. Установка NumStreamedMips на -1 означает, что всем mips разрешено транслироваться внутрь или извне (все еще существуют другие ограничения, которые применяются). NumStreamedMips – это необязательный параметр, который по умолчанию равен -1.

Фильтрация

MinMagFilterMipFilterТип фильтра
точкаТочка
линейныйточкаБилинейный
линейныйТрехлинейный
anisoточкаАнизотропная точка
anisoАнизотропный линейный

Группа текстур, группа LOD и смещение LOD

Параметры TextureGroup (группа текстур) и LODBias (смещение LOD), указанные в конфигурационных файлах ini, а также параметры LODGroup (группа LOD) и LODBias, указанные в свойствах текстуры, определяют окончательный набор текстурных mips, используемых для отдельной текстуры.

Пример записи TextureGroup в [your_game] Engine.ini может выглядеть так:


TEXTUREGROUP_World=(MinLODSize=256,MaxLODSize=1024,LODBias=0,MinMagFilter=aniso,MipFilter=point,NumStreamedMips=3)

Любые текстуры, назначенные TEXTUREGROUP_World LODGroup, будут использовать эти параметры для определения диапазона mip, используемого для рендеринга.
Дополнительный параметр LODBias в свойствах текстуры является аддитивным (добавочным) с LODBias, указанным в файле конфигурации ini TextureGroup.

LODBias смещение, mip которого выбран для рендеринга. LODBias вычисляется до диапазона LODGroup Min / Max. LODBias в свойствах текстуры добавляется в LODBias в TextureGroup для определения конечного значения LODBias.
LODBias 0 – основное (собственное) разрешение текстуры. LODBias 1 – это первый mip для текстуры, LODBias 2 – это второй mip ниже и т.д. Например, текстура 1024 x 1024, имеющая LODBias из 1, приводит к выбору пикселя 512 x 512 для рендеринга.

LODBias, указанный в свойствах текстуры для каждой отдельной текстуры, может быть положительным или отрицательным, так что он может смещать LODBias по умолчанию TextureGroup на значения с более высоким или низким значением mip.
Например:

  • A TextureGroup LODBias 0 и свойства текстуры LODBias из 0 приведут к завершению LODBias в 0.
  • A TextureGroup LODBias 0 и свойства текстуры LODBias из 1 приведут к окончательному LODBias в 1.
  • A TextureGroup LODBias из 1 и свойства текстуры LODBias из 1 приведет к окончательному LODBias в 2.
  • A TextureGroup LODBias из 1 и свойства текстуры LODBias из -1 приведет к окончательному LODBias в 0.

После того, как вычисляется окончательный LODBias, он проверяется, отображается ли он в диапазоне Min / Max LODSize TextureGroup, и при необходимости он корректируется. Это позволяет просто изменить конфигурацию файла ini, чтобы эффективно закрепить определенную группу TextureGroup в пределах диапазона min / max LOD.

Например, текстура 1024 x 1024 с LODBias из 1 использует микс 512 x 512, и если он находится в TODTUREGROUP_World LODGroup, как показано выше, затем он проверяется, находится ли он в пределах диапазона Maximum и Maximum LODSize TextureGroup, который в этом случае равен 256 и 1024. Поскольку у каждого названия игры будут свои собственные уникальные настройки TextureGroup, художники и разработчики уровней должны знать о MinLODSize и MaxLODSize для каждой группы. Это увеличит размер распределяемого пакета без выгоды качества рендеринга, если игра будет отправлена ​​с текстурами 2048, назначенными TextureGroup с MaxLODSize 1024.

Свойства Текстуры

Для объяснения смысла различных свойств текстуры смотрите страницу Свойства текстуры.