Код приложения, в котором создаются и используются эти шейдеры, приведен в разделе 7.11 после описания API языка тендеров OpenGL. Результат рендеринга нескольких простых объектов показан на рис. 6.4 (см. также цветной рис. 25).

Плоский многоугольник, шар и тор, рендеринг которых выполнялся шейдерами кирпичной стенки

Рис. 6.4. Плоский многоугольник, шар и тор, рендеринг которых выполнялся шейдерами кирпичной стенки

6.4. Замечания В приведенном решении задачи есть несколько подводных камней, из-за которых оно может использоваться только в самых простых случаях. Так как шаблон кирпичной стены вычисляется с использованием модельных координат заданного объекта, видимые размеры кирпичей зависят от размера объекта в модельных координатах. Некоторые объекты в результате будут выглядеть хорошо, но для других созданные нами кирпичики будут либо слишком большими, либо слишком маленькими. Чтобы избежать этого, для вершинного шейдера нужно задать параметр - ишЬгт-переменную, в соответствии со значением которой шаблон будет масштабироваться по отношению к модельным координатам. Приложение могло

ISO

Пример простого шейдера

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

Так как рисунок привязывается к координатам объекта хну в модельном пространстве, изображение может выглядеть нереалистичным на сложных объектах (см. рис. 6.4). Используя только х- и //-координаты объекта, будет сложно работать, например, с бесконечно глубокими объектами. Кирпичный рисунок выглядит хорошо на передней грани объектов, но на боковых гранях глубина кирпичиков выглядит несоразмерно большой. Для того чтобы шейдер был по-настоящему трехмерным, в процедуру вычисления нужно добавить третье измерение и использовать z-компоненту координат в модельном пространстве, чтобы определить цвет точки в измерении Z.

Если рассмотреть рисунок при увеличении, можно увидеть неровности вдоль границы между кирпичом и промежутком, Они появляются из-за резкого изменения значения функции step (с 0 до 1,0) при переходе от кирпичика к промежутку. Созданный нами шейдер может выбирать для каждого фрагмента лишь один из двух цветов, и неровности появляются из-за того, что частота семплинга слишком низкая. Чтобы избежать этого, вместо функции step можно использовать встроенную функцию smoothstep. Она похожа на step, за исключением того, что переход от 0 к 1,0 у нее плавный. Это дает эффект размывания границ между кирпичом и промежутком, отчего деформированный край становится не таким заметным. Метод аналитического сглаживания описан в разделе 14.4.5.


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