reckfellENGINE

Ограничения графики и диагностика артефактов

Размеры текстур, память, banding, Z-fighting и сортировка прозрачности.

На этой странице

Выбирайте исправление по видимому симптому. Ограничения размера текстур, нехватка памяти, ступени градиента, точность глубины и порядок прозрачности — разные проблемы. Одновременное изменение всех настроек мешает найти причину.

Размер текстуры — не бюджет памяти

Универсального лимита «4096 на телефоне, 8192 на ПК» нет. Максимальные размеры зависят от активного API, драйвера и GPU. Поддерживаемый размер также не гарантирует, что ресурсу хватит памяти и он будет работать эффективно.

Для рендереров RenderingDevice запрашивайте активное устройство. Этот класс также показывает фактический метод и драйвер, чтобы не пропустить переход на резервный путь:

C#
using Reckfell;

public static class RendererInfo
{
    public static string Summary()
    {
        return RenderingServer.GetCurrentRenderingMethod() + " / " +
            RenderingServer.GetCurrentRenderingDriverName();
    }

    // Null means this API cannot report the limit, not that textures are unlimited.
    public static ulong? MaximumTexture2D()
    {
        var device = RenderingServer.GetRenderingDevice();
        // This is the engine's shared device. Do not dispose/free it here.
        return device is null ? null :
            device.LimitGet(RenderingDevice.Limit.MaxTextureSize2D);
    }
}

Вызывайте RendererInfo.Summary() после инициализации рендерера. MaximumTexture2D() возвращает лимит размера 2D-текстуры активного RenderingDevice либо null, когда запрос недоступен, в том числе в проверенном Compatibility/OpenGL. Null не означает безлимитные текстуры или отсутствие их поддержки. Не освобождайте общее устройство движка. Не переносите этот лимит на кубические, 3D- или массивные текстуры: у них отдельные ограничения.

Локальная проверка успешно запросила лимит в Mobile/Vulkan и Forward+/Vulkan, но не выделяла текстуру максимального размера. Проверяйте характерные для проекта текстуры в экспортированной игре на целевом оборудовании.

Несжатое изображение 4096 × 4096 RGBA8 занимает 64 МиБ без mipmaps. Полная цепочка mipmaps добавляет примерно треть: получается около 85,3 МиБ. Сжатие, слои, копии, render targets, MSAA и формат меняют стоимость; маленький размер скачанного файла не определяет расход памяти GPU.

Чтобы уменьшить импортируемую текстуру, задайте Process → Size Limit (process/size_limit) положительный предел и выполните повторный импорт. Импортёр уменьшает длинную сторону и подстраивает вторую с сохранением пропорций с учётом целочисленного округления; исходный файл не меняется. Проверяйте полученный ресурс, а не только размер исходной картинки. Нулевое значение не обещает отключение всех аппаратных ограничений. Формат сжатия, mipmaps и платформенные варианты импорта также имеют значение.

Отличите ступени градиента от ошибки света

Banding — заметные ступени в плавном градиенте. Причина может быть в исходной текстуре, сжатии, промежуточном буфере или конечном выводе. HDR-расчёты не гарантируют достаточную точность итогового сигнала для любого градиента.

  • Сначала проверьте исходную и импортированную текстуры. Перевод уже квантованного изображения во float не возвращает потерянные значения.
  • Уточните активный рендерер, формат render target и путь вывода. Нельзя определять фиксированную точность цвета/глубины только по словам «ПК» или «мобильный».
  • В пути RenderingDevice Viewport.UseDebanding может скрыть квантование вывода с помощью дизеринга, но не восстановить детали источника. В текущей реализации Compatibility этот флаг не используется буфером рендеринга; сохранённое true не доказывает работу эффекта.
  • Для специально подготовленных градиентов помогает деликатный дизеринг ассета или материала. Сравнивайте при итоговом размере вывода: дополнительный шум не исправляет неверное преобразование цвета.

Разница между кодированием цвета, тональным преобразованием и обрезанными данными разобрана в статье HDR и экспозиция. Debanding не исправляет утечки света и текстуру, назначенную не в тот слот материала.

Отличите Z-fighting от дефекта текстуры

Z-fighting часто выглядит как мерцающие пятна, меняющиеся при движении камеры: почти совпадающие поверхности спорят за глубину. Перед заменой текстуры проверьте дубли полигонов и пересекающиеся меши.

  1. Уберите дубли геометрии или задайте поверхностям осмысленный физический зазор.
  2. Увеличьте Camera3D.Near настолько, насколько позволяет ближайшая нужная геометрия. Слишком большое значение обрезает близкие объекты.
  3. Уменьшите избыточный Far, но не ожидайте, что он компенсирует крайне маленький near.
  4. При назначенном CameraAttributesPhysical меняйте FrustumNear / FrustumFar этого ресурса: он задаёт границы камеры.
  5. Перепроверьте ближайшие и дальние положения камеры в активном рендерере. Reverse-Z и форматы глубины различаются между путями; нельзя обещать одну разрядность или универсальное исправление точности.

Смещения полигонов и глубины не исправляют физически неверную сцену в целом. Очень большие координаты — отдельная проблема точности; для неё есть статья Большие координаты мира.

Выбирайте прозрачность по задаче ассета

Alpha blending сортирует прозрачные поверхности на уровне объектов/поверхностей, а не каждый пересекающийся треугольник. В исходниках Forward+ порядок определяется приоритетом и ключом глубины экземпляра; SortingUseAabbCenter влияет на расчёт этого ключа. Поэтому утверждение «всё сортируется только по началу Entity» слишком категорично.

ЗадачаИсходный вариантОграничение
Сплошной объектНепрозрачный материалОдин лишь alpha albedo не включает прозрачность.
Листва/ограда с непрозрачными и пустыми участкамиBaseMaterial3D.TransparencyEnum.AlphaScissor с подходящим порогомНет частично прозрачного покрытия; проверьте края с выбранным AA.
Стекло/дым с частичной прозрачностьюAlpha blendingОшибки пересечений и порядка могут остаться.
Маленький прозрачный участок на большом сплошном мешеОтдельные непрозрачные и прозрачные поверхности материалаНужна соответствующая подготовка меша и материалов.

Для контролируемого наложения Material.RenderPriority и VisualInstance3D.SortingOffset меняют порядок. Они не делают пересекающиеся прозрачные объёмы независимыми от порядка и не возвращают потерянную глубину отдельных треугольников. Приоритеты не являются универсальным исправлением стекла, волос и растительности.

Прозрачные поверхности участвуют не во всех проходах глубины и нормалей так же, как непрозрачные. Проверьте конкретный экранный эффект, прежде чем ожидать обработки стекла как сплошной стены. Depth prepass меняет участие фрагментов, но не решает все наложения полупрозрачности.

Сравнивайте воспроизводимо

Зафиксируйте рендерер, камеру, экспозицию, размер viewport и содержимое. Меняйте одну относящуюся к дефекту величину, снимайте кадр после завершения отрисовки и проверяйте движение. Отдельные настройки разобраны в статьях Сглаживание в 3D и Стандартные материалы.

Проверки runtime подтверждают фактические запросы метода/драйвера/устройства и ранее выполненные проверки пикселей для alpha/scissor, MSAA, масштабирования и отдельных эффектов. Уменьшение при импорте, исчерпание памяти, banding/debanding, Z-fighting, пересечения прозрачности и вся матрица устройств/экспорта здесь сверены по исходникам, а не объявлены прошедшими визуальную приёмку.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.