Что такое интерполяция в OpenGL?

Я только начал изучать OpenGL ES 2.0, во время процесса я встретил некоторые термины, которые не имеют смысла для меня, даже если есть определения. Вот так: интерполяция

из книги OpenGL ES 2.0 руководство по программированию, Я вижу это определение для интерполяция:

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

хотя я понимаю, что Linear Interpolation с ответ, определение выше не имеет смысла для меня.

вы бы поставили это по-другому и сделали пример, чтобы уточнить, что такое интерполяция?

1 ответов


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

вы используете интерполяцию, когда у вас есть ограниченное количество данных, пытающихся представить неограниченное количество данных, например, у вас есть 2 точки, представляющие линию:

для интерполяции вам всегда нужен намек на представление, в случае линии вам нужно 2 точки (и подсказка "это линия"), скажем, они являются векторами A и B. теперь решение T(s) = A + s*(B-A) для любого реального числа "s", чтобы получить бесконечную линию в обоих направлениях. Чтобы получить линию между A и B нужно определить 's' на интервале [0, 1], так что T(0)=A пока T(1)=B и это линейная интерполяция.

для немного более сложных интерполяций вы можете посмотреть в openGL немного:

обратите внимание, что алгоритмы, используемые в GL и вашем GPU, намного сложнее и оптимизированы, чем то, что я собираюсь написать здесь, но обычно имеют то же самое результат.

в случае фигур вы обычно используете треугольники, определенные с 3 векторами (вершиной), и говорите, что это треугольник (вы говорите "треугольники" в своем методе рисования). После применения некоторых матриц к этим векторам вы получите их 2d-проекцию на буфер рисования (может произойти в вершинном шейдере). Теперь вам нужно заполнить все эти точки в буфере некоторыми цветовыми, текстурными или цветовыми интерполяциями. Прежде всего, все эти нарисованные точки (фактически их положение на буфере) являются результатом линейный интерполирующий механизм (вы не контролируете его в GL). Во-вторых, какой цвет будет заполнен, обычно снова линейная интерполяция:

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

вход:

Vector a, b, c; //original triangle positions
Vector interpolationABC; //current fragment interpolation between a, b and c
Color colorA, colorB, colorC; //colors for vectors a, b and c

вывод (цвет этого фрагмента):

Color output = (
(a - interpolationABC).length() * colorA + 
(b - interpolationABC).length() * colorB + 
(c - interpolationABC).length() * colorC ) 
/ (
(a - interpolationABC).length() + 
(b - interpolationABC).length() + 
(c - interpolationABC).length() );

этот механизм снова представляет собой линейную интерполяцию (на самом деле очень медленную, но она должна делать трюк и очень читабельна)

что касается примера нелинейной интерполяции, вам понадобится немного воображения: допустим, мы рисуем сферу. Чтобы все было просто, скажем так. его центр находится в (0,0,0), а его радиус равен 1. Сфера создается с N треугольниками, и если N недостаточно велик (в большинстве случаев) из-за проблемы производительности, он немного "острый", и мы хотели бы немного сгладить его. Поэтому мы должны включить некоторые огни (это просто круг без света в любом случае) и выяснить, как установить нормали. С одной стороны, вы можете вычислить Нормаль для поверхности, определенной 3 точками, и каждый треугольник будет иметь уникальную нормаль, но будет производить эффект "диско-шара", с другой рука вы знаете, что Нормаль любой точки " P " сферы normalized(P-center) или в этом случае сама точка. Таким образом, каждая Нормаль вершины - это сама позиция вершины (поэтому теперь каждый треугольник имеет 3 разных нормали), а Нормаль каждого фрагмента-интерполяция этих нормалей:

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

опять же, механизм интерполяции-это механизм, который может производить неограниченное количество результатов, зная только ограниченное количество данных (один из этих механизмов называют "линейная интерполяция"). Или другими словами, как вы опубликовали для немного более конкретного примера:

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