Затенение по Фонгу

Затенение по Фонгу

Затенение по Фонгу — модель освещения трёхмерных объектов, в том числе полигональных моделей и примитивов.

Содержание

Гладкое затенение

Модели обычно задаются набором плоских выпуклых граней, хотя большинство реальных трёхмерных предметов имеют гладкие криволинейные поверхности. Таким образом, криволинейная поверхность рисуется как ребристая полигональная сетка; для того, чтобы эта сетка выглядела гладкой, используется тот или иной метод интерполяции освещённости вершин полигональной сетки.

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

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

n=\frac{a_1 n_1+...+a_k n_k}{\left \Vert a_1 n_1+...+a_k n_k\right\|}

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

Модель освещения

Освещение по Фонгу включает в себя также и модель освещения Фонга, т.е. алгоритм расчёта освещения в заданной точке. Это локальная модель освещения, т.е. она учитывает только свойства заданной точки и источников освещения, игнорируя эффекты рассеивания, линзирования, отражения от соседних тел.

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

Другие модели освещения могут лучше учитывать свойства материала (локальные модели Орена-Наяра, Кука-Торренса, анизотропные модели) или сложные оптические явления (глобальные модели), но ведут к росту накладных расходов.

Способ расчёта освещения

Расчёт освещения по Фонгу требует вычисления цветовой интенсивности трёх компонент освещения: фоновой (ambient), рассеяной (diffuse) и глянцевых бликов (specular). Фоновая компонента — грубое приближение лучей света, рассеянных соседними объектами и затем достигших заданной точки; остальные две компоненты имитируют рассеивание и отражение прямого излучения.

Иллюстрация различных компонент, соединённых в модели Фонга

I=K_aI_a+K_d(\vec{n},\vec{l})+K_s(\vec{n},\vec{h})^p\,\!

где

\vec{n}\,\! — вектор нормали

\vec{l}\,\! — направление проецирования

K_a\,\! — коэффициент фонового освещения

K_s\,\! — коэффициент зеркального освещения

K_d\,\! — коэффициент диффузного освещения

Освещение в OpenGL

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

Алгоритм расчёта освещения по Фонгу можно проиллюстрировать с помощью следующих шейдеров:

Вершинный шейдер

varying vec3 n;
varying vec3 v;
 
void main(void)
{
    v = vec3(gl_ModelViewMatrix * gl_Vertex);
    n = normalize(gl_NormalMatrix * gl_Normal);
    gl_Position = ftransform();
}

Фрагментный шейдер

varying vec3 n;
varying vec3 v;
 
void main(void)
{
    vec4 result = vec4(0.0);
    for (int li = 0; li < gl_MaxLights; ++li)
    {
        vec3 l;
        if (gl_LightSource[li].position.w != 0.0)
        {
            l = normalize(gl_LightSource[li].position.xyz - v);
        }
        else
        {
            l = normalize(gl_LightSource[li].position.xyz);
        }
        vec3 e = normalize(-v);
        vec3 r = normalize(-reflect(l, n));
 
        vec4 Iamb = gl_FrontLightProduct[li].ambient;
 
        vec4 Idiff = gl_FrontLightProduct[li].diffuse * max(dot(n, l), 0.0);
        Idiff = clamp(Idiff, 0.0, 1.0);
 
        vec4 Ispec = gl_FrontLightProduct[li].specular
                     * pow(max(dot(r, e), 0.0),
                           gl_FrontMaterial.shininess);
        Ispec = clamp(Ispec, 0.0, 1.0);
 
        result += Iamb + Idiff + Ispec;
    }
 
    gl_FragColor = gl_FrontLightModelProduct.sceneColor + result;
}

Где величина

gl_FrontLightModelProduct.sceneColor

эквивалентна выражению

gl_FrontMaterial.emission + gl_FrontMaterial.ambient * gl_LightModel.ambient

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Затенение по Фонгу" в других словарях:

  • Затенение Фонга — Затенение по Фонгу метод освещения полигональных моделей. Модели обычно задаются набором плоских выпуклых граней. Существует несколько простых методов: плоское затенение, метод Гуро и метод Фонга. Гладкий объект от негладкого отличается тем, что… …   Википедия

  • Затенение Гуро — Метод тонирования Гуро  метод закрашивания в трёхмерной компьютерной графике (затенения), предназначенный для создания иллюзии гладкой криволинейной поверхности, описанной в виде полигональной сетки с плоскими гранями, путём интерполяции цветов… …   Википедия

  • Затенение по Гуро — Метод тонирования Гуро  метод закрашивания в трёхмерной компьютерной графике (затенения), предназначенный для создания иллюзии гладкой криволинейной поверхности, описанной в виде полигональной сетки с плоскими гранями, путём интерполяции цветов… …   Википедия

  • Затемнение Фонга — Затенение по Фонгу метод освещения полигональных моделей. Модели обычно задаются набором плоских выпуклых граней. Существует несколько простых методов: плоское затенение, метод Гуро и метод Фонга. Гладкий объект от негладкого отличается тем, что… …   Википедия

  • Модель освещения фонга — Затенение по Фонгу метод освещения полигональных моделей. Модели обычно задаются набором плоских выпуклых граней. Существует несколько простых методов: плоское затенение, метод Гуро и метод Фонга. Гладкий объект от негладкого отличается тем, что… …   Википедия

  • Список алгоритмов — Эта страница информационный список. Основная статья: Алгоритм Ниже приводится список алгоритмов, группированный по категориям. Более детальные сведения приводятся в списке структур данных и …   Википедия

  • Ambient occlusion — Использованы модели (сверху вниз): прямого освещения, Ambient occlusion (AO)и комбинированная модель AO и прямого освещения Ambient occlusion (AO)  модель затенения, используемая в трёхмерной графике и позволяющая добавить реалистичности… …   Википедия

  • Half-Life 2: Episode Two — Обложка зарубежного издания DVD диска с игрой. Разработчик …   Википедия

  • Программируемые алгоритмы —       Служебный список статей, созданный для координации работ по развитию темы.   Данное предупреждение не устанавл …   Википедия

  • Рельефное текстурирование — Для термина «Рельеф» см. другие значения. Сфера без рельефной текстуры; Рельефная текстура, наложенная на изображение ниже; Сфера геометрически идентичная первой, но с наложенной рельефной текст …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»