real = (tempreal * tempreal) - (imag * imag) + Creal; imag = 2.0 * tempreal * imag + Cimag: r2 = (real * real) + (imag * imag):

}

// Цвет зависит от количества итераций

vec3 color;

if (r2 < 4.0)

color = InnerColor; el se

color = mix(OuterColorl, 0uterColor2, fract(iter * 0.05)): color *= Lightlntensity; gl_FragColor = vec4 (color. 1.0);

}

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

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

Результаты работы шейдера Мандельброта

Рис. 15.8. Результаты работы шейдера Мандельброта

15.3.4. Множества Джулии

Множества Джулии немного похожи на множество Мандельброта. Каждая точка в множестве Мандельброта может использоваться для создания множества Джулии, и эти новые множества не менее интересны. Единственное их отличие в том, что константа с в уравнении Z2 + с устанавливается в значение какой-нибудь точки, входящей в множество Мандельброта (кроме той, которую рисуют в данный момент). Чтобы изменить фрагментный шейдер соответствующим образом, нужно поменять две строки кода, инициализирующие значение с:

float Creal = -1.36: // Теперь мы увидим интересное множество

float Cimag = 0.11; На рис. 15.9 показано несколько примеров множеств Джулии, которые можно создавать с помощью этого шейдера. Для этого можно параметризовать значения Сгеа 1 и Cimag, передавая их через uniform-переменные.

Множества Джулии, нарисованные шейдером Мандельброта

Рис. 15.9. Множества Джулии, нарисованные шейдером Мандельброта

15.4. Итоги

Далеко не во всех интерактивных графических программах нужен реализм. Используя современные возможности графического аппаратного обеспечения, легко можно создавать любые нужные эффекты. С помощью высокоуровневого процедурного языка, такого как язык шейдеров OpenGL, художники и создатели графических программ могут программировать алгоритмы для рисования в художественных стилях, имитируя, например, перо, гравюру, живопись. В этой главе был представлен процедурный шейдер штриховки, который иллюстрирует процесс создания таких шейдеров. Различные виды технических иллюстраций можно создавать с помощью шейдера Гуча, описанного в этой главе. Можно также создавать шейдеры для визуализации математических функций, например шейдеры Мандельброта и Джулии.

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

15.5. Ссылки

Нефотореалистичному рендерингу посвящены книги [10 и 16].

Алгоритм Гуча определен и описан в докладе [8]. Доклад основан на принципах, описанных Эдвардом Тафте в 1997 г. Небольшое обсуждение NPR приводится в книге ШКлассическое описание фракталов и множества Мандельброта приведено в книге [12]. В 1986 г. Хайнц-Отто Питжен и Петер Рихтер написали книгу [14].


⇐ вернуться назад | | далее ⇒