Метод бугристой поверхности создает видимое усложнение поверхности во время обработки фрагментов, так что обрабатываться она будет во фрагментном шейдере. Это означает, что вычислять освещение нужно не в вершинном шейде-ре, как это делается обычно, а во фрагментном. Так проявляется еще одно преимущество программируемое™, доступной с помощью языка шейдеров OpenGL, - возможность выполнять операции в тех местах, где они нужны, - в вершинном или фрагментном шейдере. Не обязательно полагаться на обычную последовательность выполнения операций.

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

1 Игра елок; «Ііоіу cow* можно перевести как «дырявая корова», в то время как это устоявшееся неформальное выражение «ну и дела!». - Примеч. перев.

Процедурные текстурные шейдеры

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

Источник освещения обычно рассчитывается с помощью функции dot. Чтобы результат имел какое-то значение, его нужно преобразовать так, чтобы все компоненты, необходимые для вычисления освещения, были определены в одном и том же пространстве координат. Обычно при вычислении освещения в вершинном шейдере векторы направлений или источники освещения задаются в пространстве координат обзора, а входные нормали и значения вершин преобразуются в это пространство координат.

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


⇐ Предыдущая| |Следующая ⇒