Фононное освещение: добавить зеркальное освещение отдельно или с рассеянным или рассеянным светом?

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

Вот фрагментный шейдер с обоими имеющимися опциями и со скриншотами.

#version 330 core
out vec4 FragColor;

in vec2 TexCoord;
in vec3 normals;
in vec3 fragPosition;


//texture samplers
uniform sampler2D texture1;
uniform vec3 ambientLight;
uniform vec3 lightPosition;
uniform vec3 lightColor;
uniform vec3 viewPosition;
uniform float specularStrength;
uniform float shineDamp;

void main()
{
    vec3 norm = normalize(normals);
    vec3 lightDir = normalize(lightPosition - fragPosition); 

    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * lightColor;

    vec3 viewDir = normalize(viewPosition - fragPosition);
    vec3 reflectDir = reflect(-lightDir, norm);
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), shineDamp);
    vec3 specular = specularStrength * spec * lightColor;  

    // 1. Specular is added to ambient and diffuse lights and this result is multiplied with texture
    //FragColor = vec4((ambientLight + diffuse + specular), 1.0f) * texture(texture1, TexCoord);

    // 2. Specular is added separately to result of multiplication of ambient + diffuse and texture
    //FragColor = vec4((ambientLight + diffuse), 1.0f) * texture(texture1, TexCoord) + vec4(specular, 1.0);
}
  • Вариант 1. Зеркальное добавление к рассеянному и рассеянному

    введите описание изображения здесь

  • Вариант 2. Specular добавляется отдельно.

    введите описание изображения здесь

На этих скриншотах значение shineDump было 32.0f, а specularStrength было 0.5f.

Какой из них выглядит правильно? На мой взгляд, второй вариант выглядит правильным по сравнению с первым, но во многих руководствах используется формула из первого варианта.

2 ответа

Решение

Я пытаюсь реализовать освещение Фонг. В некоторых уроках зеркальное освещение добавляется к окружающему и рассеянному освещению, а затем общее освещение умножается на цвет текстуры.

Это исторический артефакт из темных веков, когда уравнения освещения были еще жестко запрограммированы в графических процессорах, и когда затенение Гуро было стандартом. Модель освещения оценивалась только по вершинам, и полученное значение света интерполировалось по всему примитиву. Поскольку текстура часто используется для имитации поверхностных свойств материала, текстура обычно отбирается для каждого фрагмента (чтобы мы могли придать структуру нашим примитивам за пределами уровня, указанного в геометрии). Но из-за затенения Гуро нам нужно модулировать уже рассчитанное значение света с данными текстуры на фрагмент. Самый простой подход - просто умножить оба.

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

Модуляция всего освещения цветом текстуры дает нереальные результаты для большого количества материалов. Чтобы решить эти проблемы, зеркальную часть иногда отделяли. Теперь мы вычисляем amibient + diffuse часть и зеркальную часть для каждой вершины, интерполируем их, модулируем ambient + diffuse с текстурой и добавляем зеркальную часть впоследствии для каждого фрагмента.

Однако в настоящее время никто не собирается использовать затенение Гуро, вместо этого мы рассчитываем освещение на фрагмент. У нас больше нет разных частот для оценки модели освещения и выборки текстур, поэтому эти вопросы становятся абсолютно бессмысленными. Поскольку фактический свет, отражаемый какой-либо поверхностью, зависит от материала, и мы используем текстуры для имитации этого материала, мы можем напрямую использовать текстуры в качестве входных данных для расчетов освещения, то есть как диффузное альбедо, или зеркальную отражательную способность, или что-то еще. Это также позволяет нам изменять произвольные свойства материала по всему примитиву, а не только "цвета", блеск / шероховатость могут также исходить от текстуры, как обычные направления и любые параметры, которые может использовать ваша модель освещения.

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

В целом, модели BRDF можно классифицировать по одной или двум из следующих категорий:

  • Эмпирический: их главная цель - предоставить простую формулировку, специально разработанную для имитации своего рода отражения. Следовательно, мы получаем быструю вычислительную модель, регулируемую параметрами, но без учета физики, стоящей за ней.
  • Теоретически: эти модели пытаются точно моделировать рассеяние света, используя законы физики. Они обычно приводят к сложному выражению и большим вычислительным усилиям, поэтому они обычно не используются в системах рендеринга.
  • Эксперимент: BRDF можно получить с помощью гониорефлектометра, который механически изменяет положение источника света и датчика. Другие методы используют цифровые камеры для получения множества образцов BRDF с одной фотографии.

Смотрите дальше:


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

Другие вопросы по тегам