Интерполяция текстур

Тема в разделе "WASM.GUI", создана пользователем HoShiMin, 10 ноя 2019.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Доброго дня форумчанам.
    С графикой никогда напрямую не работал, вопрос будет по графике в целом и по Qt Quick 3D в частности.

    Итак, у нас есть текстура в очень низком разрешении (скажем, 8х8 пикселей), натягиваем её на прямоугольник.
    Затем приближаем камеру к прямоугольнику - таким образом, на экране он занимает уже не 8х8, а пусть 64х64 пикселя. Текстура при этом оказывается линейно интерполированной (нечёткой), а хотелось бы интерполяцию на основе ближайших соседей (чтобы 1 пиксель при масштабировании в N раз превращался к квадрат NxN).

    Соответственно, вопросы: как вообще происходит обработка текстур при приближении/отдалении камеры (масштабирует ли их видеокарта автоматически каждый раз, как меняется положение камеры, или масштабирование делают "руками" внутри движка)? И как изменить интерполянт?

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

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    По-моему это должно делаться наоборот: текстура должна храниться в максимальном разрешении, а при надобности ее размер уменьшается. В unity так сделано https://docs.unity3d.com/Manual/DynamicResolution.html
     
    UbIvItS нравится это.
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Ладно, допустим, но кто отвечает за интерполяцию текстур? Сама видеокарта? Или вручную можно задать алгоритм? Ведь при любом движении камеры необходимо пересчитывать, как будет выглядеть текстура: повернули камеру, углы изменились, из-за перспективы квадрат стал трапецией - текстуру необходимо в неё вписать. Кто это делает? Видеокарта? Движок? Видеодрайвер? И можно ли поменять используемые для этих трансформаций алгоритмы?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Не выспался, шляпу линканул. Вобщем эта технология называется texture mipmap, когда в саму текстуру заложена информация, как понижать ее разрешение по мере надобности. Возможность еще на уровне direct3d-функций заложена https://docs.microsoft.com/en-us/windows/win32/direct3d9/texture-filtering-with-mipmaps
     
  5. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    К сожалению, мне изначально приходится работать с текстурами очень низкого разрешения.
    Здесь https://learnopengl.com/Getting-started/Textures узнал, что есть флажок GL_NEAREST, включающий фильтрацию именно по ближайшим соседям, что мне и нужно. Осталось понять, как заставить QtQuick3D работать с этим флагом...