Что такое, проще говоря, textureGrad ()? - PullRequest
0 голосов
/ 24 октября 2018

Я читаю khronos wiki на этом

Но я не совсем понимаю, что он говорит.Что именно делает textureGrad?

Я думаю, что он выбирает несколько уровней mipmap и вычисляет смешение цветов, используя заданные ему явные производные векторы.Но я не уверен.

1 Ответ

0 голосов
/ 24 октября 2018

Когда вы выбираете текстуру, вам нужны конкретные координаты текстуры для выборки данных текстуры в.Для простоты я собираюсь принять 2D-текстуру, поэтому координаты текстуры - это 2D-вектор (s,t).(Объяснение аналогично для других измерений).

Если вы хотите нанести на карту текстуру треугольника, обычно для достижения координат текстуры используется одна из двух стратегий:

  1. Текстурные координаты являются частью модели.Каждая вершина содержит координаты 2D-текстуры в качестве атрибута вершины.Во время растеризации эти текстурные координаты интерполируются по всему примитиву.
  2. Вы указываете математическое отображение.Например, вы можете определить некоторую функцию, отображающую координаты трехмерного объекта на некоторые координаты двухмерной текстуры.Например, вы можете определить некоторую проекцию и спроецировать текстуру на поверхность, точно так же, как реальный проектор проецирует изображение на некоторые объекты реального мира.

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

Ключевой момент таков: каждый фрагмент имеет 2D-координаты пикселя (x,y), а также 2D-координаты текстуры.(s,t), поэтому мы можем в основном интерпретировать это соотношение как математическую функцию:

(s,t) = T(x,y)

Поскольку это векторная функция в 2D-векторе положения пикселя (x,y), мы также можем строить частные производные вдоль *Направление 1020 * (вправо) и y (вверх), которые говорят, используют скорость изменения координат текстуры вдоль этих направлений.

И dTdx и dTdy в textureGrad - это просто.

Так для чего это нужно графическому процессору?

Если вы хотите на самом деле фильтровать текстуру (в отличие от простой точечной выборки ), вам необходимо знать след пикселя в текстурном пространстве.Каждый отдельный фрагмент представляет область одного пикселя на экране, и вы собираетесь использовать одно значение цвета из текстуры, чтобы представить весь пиксель (за исключением мультисэмплинга).Контур пикселя теперь представляет фактическую область, которую пиксель будет иметь в текстурном пространстве.Мы могли бы рассчитать это путем интерполяции текстовых координат не для центра пикселя, а для 4 углов пикселя.Результирующие текстовые координаты будут образовывать трапецию в текстурном пространстве.

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

След текстуры говорит вам:

  • , если текстурауменьшено или увеличено (GL имеет разные настройки фильтра для каждого случая)
  • сколько текселей будет отображено на каждый пиксель, поэтому какой уровень mipmap будет подходящим
  • сколько анизотропии в пикселеслед.Каждый пиксель на экране и каждый тексель в текстурном пространстве - это, по сути, квадрат, но занимаемая им площадь пикселя может значительно отличаться от и может быть намного выше ширины или наоборот (особенно в ситуациях с высоким искажением перспективы).Классические билинейные или трилинейные текстурные фильтры всегда используют квадратный след фильтра, но фильтр анизотропных текстур будет использовать эту информацию для фактического генерирования следа фильтра, который более точно соответствует фактическому следу пикселя (чтобы избежать смешивания в текстовых данных, которые не должныдействительно принадлежат пикселю).

Вместо вычисления координат текстуры во всех углах пикселя мы будем использовать частные производные в центре фрагмента в качестве приблизительного значения для отпечатка пикселя.

Следующая диаграмма показывает геометрические отношения:

diagram of pixel footprint in texture space

Это представляет собой след четырех соседних пикселей (2x2) в текстурном пространстве, поэтому равномерной сеткой являются тексели, а 4 трапеции представляют 4-пиксельные следы.Теперь вычисление фактических производных подразумевает, что у нас есть более или менее явная формула T(x,y), как описано выше.Графические процессоры обычно используют другое приближение: просто посмотрите на фактические текстовые координаты соседних фрагментов (которые будут рассчитаны в любом случае) в каждом 2x2 пиксельном блоке, и просто приблизьте площадь с помощью конечной разности - просто вычитаяфактические texcoords для соседних фрагментов друг от друга.Результат показан в виде пунктирного параллелограмма на диаграмме.

В аппаратном обеспечении это реализовано таким образом, что всегда квадраты размером 2x2 пикселя заштрихованы параллельно в одной и той же карте деформации / фронта / SIMD-группы.Производные функции GLSL, такие как dFdx и dFdy, просто работают, вычитая фактические значения соседних фрагментов.И стандартная функция texture просто внутренне использует этот механизм в аргументе координаты текстуры.Функции textureGrad позволяют обойти это и позволяют вам задавать свои собственные значения, что означает, что вы управляете тем, какой размер пиксела занимает GPU при выполнении фактического выбора уровня фильтрации / mipmap.

...