38. Построение реалистических изображений. Закраска Фонга (улучшение аппроксимации кривизны поверхности). - p1xelse/CG GitHub Wiki

Информация, рассказанная Куровым на консультации 09.06.2020

Модели закраски

Три способа закрашивания:

  1. Простая закраска
  2. Закраска по Гуро
  3. Закраска по Фонгу

1. Простая закраска

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

Простая закраска используется при выполнении трех условий:

  1. Предполагается, что источник находится в бесконечности. Падающие лучи параллельны друг другу. Это повлияет на расчёт диффузной составляющей, так как она зависит от угла падения. Для всех точек угол падения одинаков, значит диффузная составляющая одинакова. Всё прекрасно.
  2. Наблюдатель находится в бесконечности. Вектор, образованный вектором наблюдения взгляда и вектора зеркального отражения будет для всех точек одинаков, значит везде будет одинаковая зеркальная составляющая (интенсивность).
  3. Закрашиваемая грань является реально существующей, а не полученной в результате аппроксимации поверхности. Самое главное требование. Если мы (например, сферу) аппроксимировали гранями, и каждую грань закрашивали своим уровнем интенсивности, то одна грань одним цветом, а соседняя другим. Глаз видит резкий переход, который будет выглядеть, как ребро. Какие ребра могут быть у сферической поверхности? Использование простого подхода модели закрашивания приведет к тому, что изображение в корне не будет соответствовать исходному изображению. Исходное изображение - гладкая поверхность, а мы получаем многогранник.

Простая модель плоха тем, что возникают ребра.

2. Закраска по Гуро

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

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

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

Закраска по Гуро не предусматривает учет кривизны поверхности. При применении закраски по Гуро мы можем потерять рёбра и получить плоское изображение. Это может произойти, когда мы каждую смежную грань закрасим одним уровнем интенсивность (когда углы, образованные гранями, одинаковые).

Пример - детская книжка-раскладушка. Нормали получатся одинаковыми, интенсивности одинаковые, и каждая из трёх граней будет закрашена одним уровнем. Рёбер мы не увидим (а должны). Как решить эту проблему? Либо случайно внести изменения в полученные значения нормали (чтобы разные интенсивности получились), либо, если речь идет об аппроксимации поверхности, разбить на более мелкие грани - еще один шаг аппроксимации.

img

Закраска по Гуро хорошо сочетается с диффузной составляющей поверхности (матовой).

3. Закраска по Фонгу

Следующий шаг сделал Фонг. Он предложил таким же образом интерполировать не интенсивность, а нормали. Получится, что от точки к точке в пределах грани у нас нормали изменяются (учитывается криволинейный характер поверхности). Изображение получается более качественное, но трудоёмкость закраски по Фонгу будет в три с лишним раза выше. В Гуро, интерполируя интенсивность, мы сразу получаем нужны уровень интенсивности, а в Фонге, после того как получили нормаль в точке, нам еще только предстоит вычислить интенсивность.

Закраска по Фонгу хорошо сочетается с зеркальной составляющая. Хорошо моделирует блики, возникающие при зеркальном отражении.

Далее идет информация, нарытая Shlyapic до консультации.

Построение реалистических изображений

Включает как физические, так и психологические процессы.

При построении реалистического изображения необходимо:

  1. Учитывать оптические свойства поверхностей

  2. Воспроизводить рисунок на поверхности

  3. Воспроизводить неровности

  4. Учитывать, что поверхности отбрасывают тени.

  5. Учитывать восприятие окружающего мира человеческим глазом.

Методы закраски:

  1. Простая (на гранях резкий переход оттенков).

  2. По Гуро (сглаживание на основе интерполяции интенсивности).

  3. По Фонгу (сглаживание на основе интерполяции нормалей)

Закраска Фонга - теория из шпор предшественников

Закраска Фонга требует больших вычислительных затрат, однако она позволяет решить многие проблемы метода Гуро. При закраске Гуро вдоль скан. строки интерполируется значение интенсивности, а при закраске Фонга - вектор нормали. Затем он используется в модели освещения для вычисления интенсивности. При этом достигается лучшая локальная аппроксимация кривизны поверхности. Изображение выходит более реалистическим. В частности, правдоподобнее выглядят зеркальные блики.

Трудности метода: (при создании кинокадра) закраска может значительно меняться от кадра к кадру (правило закраски зависит от ориентации объекта).

  1. Вычисление векторов нормалей к каждой грани.

  2. Вычисление векторов нормалей к каждой вершине грани.

  3. Интерполяция векторов нормалей вдоль рёбер грани:

  1. Линейная интерполяция векторов нормалей вдоль скан. строки:
  1. Вычисление интенсивности в очередной точке скан. строки.

Инкрементальное вычисление вдоль скан. строки:

Закраска Фонга - теория из хайпового Роджерса

Требует больших вычислительных затрат, однако решает многие проблемы методы Гуро. При закраске Гуро вдоль сканирующей строки интерполируется значение интенсивности, а при закраске Фонга - вектор нормали. Далее он используется в модели освещения для вычисления интенсивности пиксела. При этом достигается лучшая локальная аппроксимация кривизны поверхности и, следовательно, получается более реалистичное изображение. В частности лучше выглядят зеркальные блики.

При закраске Фонга аппроксимация кривизны поверхности производится сначала в вершинах многоугольников путём аппроксимации нормали в вершине. После этого билинейной интерполяцией вычисляется нормаль в каждом пикселе. Например, обращаясь к след. рисунку получаем нормаль в Q линейной интерполяцией между A и B, в R - между B и C и, наконец, в P - между Q и R.

Таким образом:

где u = AQ/AB, w = BR/BC, t = QP/QR.

Нормаль вдоль скан. строки опять можно выразить через приращение, т.е.

где индексы 1 и 2 указывают на расположение пикселов на строке.

Хотя метод Фонга устраняет большинство недостатков метода Гуро, он также основан на линейной интерполяции. Поэтому в местах разрыва первой производной интенсивности заметен эффект полос Маха (см. ниже), хотя и не такой сильный, как при Гуро. Иногда этот эффект проявляется сильнее у метода Фонга, например для сфер. Кроме того оба метода могут привести к ошибкам при изображении невыпуклых многоугольников, например, таких

Первая сканирующая строка использует данные из вершин QRS, а вторая, лежащая ниже, берёт также данные вершины P. Это может нарушить непрерывность закраски.

Также возникают проблемы, когда любой из этих методов применяется при создании последовательности кинокадров. Например, закраска может значительно изменяться от кадра к кадру. Это происходит из-за того, что правило закраски зависит от поворотов, а обработка ведётся в пространстве изображения. Поэтому, когда от кадра к кадру меняется ориентация объекта, его закраска (т.е. цвет) тоже изменяется, причём достаточно заметно. Дафф предлагает метод закраски Гуро и Фонга, инвариантный относительно поворота.

Доп. контент (ну чисто на всякий случай)

Эффект полос Маха

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

Наблюдается, когда резко изменяется наклон кривой интенсивности. Если кривая интенсивности вогнута, то в этом месте поверхность кажется светлее, если выпукла - темнее.

Ха-ха метод Фонка (извините)