Метод бугристой поверхности не изменяет саму поверхность, а просто хитро меняет ее освещение. Поэтому неровности не будут видны на краях силуэта объекта. Например, нужно сделать модель планеты как сферы и закрасить ее с помощью метода бугристой поверхности, чтобы показать горы, большие относительно диаметра планеты. Так как в геометрии исходного объекта (сферы) ничего не меняется - она всегда будет идеально круглой, - то гор не будет видно на самом краю изображения, хотя посередине они будут рельефно выделяться. Но в реальных объектах рельеф поверхности обычно проявляется и на краях силуэта. Поэтому данный метод используется для наложения эффекта на небольшие по сравнению со всей, поверхностью участки. Апельсиновая корочка, рельефные логотипы, кирпичи с неровной поверхностью - это хорошие примеры применения метода бугристой поверхности.
Метод бугристой поверхности создает видимое усложнение поверхности во время обработки фрагментов, так что обрабатываться она будет во фрагментном шейдере. Это означает, что вычислять освещение нужно не в вершинном шейдере, как это делается обычно, а во фрагментном. Так проявляется еще одно преимущество программируемости, доступной с помощью языка шейдеров OpenGL, - возможность выполнять операции в тех местах, где они нужны, - в вершинном или фрагментном шейдере. Не обязательно полагаться на обычную последовательность выполнения операций.
Для реализации метода бугристой поверхности нужны будут правильные нормали поверхности для каждого фрагмента, а также вектор направления освещения и вектор обзора; эти значения должны быть доступны из фрагментного шейдера, В таком случае можно будет процедурно изменить нормаль перед вычислением освещения, чтобы добиться эффекта неровности поверхности, В данном примере на поверхность будут накладываться «шишечки», маленькие сферические бугорки.
Источник освещения обычно рассчитывается с помощью функции dot. Чтобы результат имел какое-то значение, его нужно преобразовать так, чтобы все компоненты, необходимые для вычисления освещения, были определены водном и том же пространстве координат. Обычно при вычислении освещения в вершинном шейдере векторы направлений или источники освещения задаются в пространстве координат обзора, а входные нормали и значения вершин преобразуются в это пространство координат.
На самом деле не обязательно выполнять все вычисления именно в этом пространстве координат. Можно нормализовать направление освещения и нормаль поверхности после преобразования их в пространство координат обзора, а затем передать их во фрагментный шейдер через varying-переменные. После интерполяции вектор направления освещения должен быть перенормализован, что позволяет получить более точные результаты. Какой бы способ ни применялся для вычисления изменяющей нормали, ее нужно преобразовать в пространство координат обзора и добавить к нормали поверхности, вектор которой также должен быть нормализован. Если ие выполнить перенормализацию, могут появиться заметные дефекты изображения. Выполнение всех этих преобразований для каждого фрагмента может значительно уменьшить производительность. Но вообще-то есть способ лучше.