□ Все области внутри множества Мандельброта (обозначенные черным цветом) сообщаются.

□ Для каждой итерации существует только одна полоса, огибающая множество Мандельброта. Полосы полностью окружают изображение, не пересекаются и не прерываются. При увеличении края получается интересное изображение.

□ Существует бесконечное количество «мини-Мандельбротов» (частей, по форме похожих на искаженное или трансформированное изображение основного множества).

15.3.2. Вершинный шейдер

Вершинный шейдер для множества Мандельброта (листинг 15.6) почти такой же, как вершинный шейдер кирпичной стенки из раздела 6.2. Единственное отличие - текстурные координаты в диапазоне [0, 1] представляются и для s, и для t. Эти значения отображаются на диапазон [-2,5, 2,5], и результат сохраняется в varying15.3. Пример Мандельброта переменной Position. Это дает фрагментному шейдеру возможность рисовать точки непосредственно в системе координат, центром которой является точка (0, 0). Если приложение рисует прямоугольник, размер которого совпадает с размером экрана и имеет текстурные координаты левого нижнего угла (0, 0) и правого верхнего угла (1, 1), в результате получится стандартное представление множества Мандельброта. С помощью шейдера Мандельброта на языке шейдеров OpenGL области можно «текстурировать» любым образом и даже накладывать простое освещение.

Листинг 15.6. Вершинный шейдер множества Мандельброта

uniform vec3 LightPosition: uniform float SpecularContribution; uniform float DiffuseContribution; uniform float Shininess;
varying float Lightlntensity: varying vec3 Position:
void main(void) {
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal):
vec3 lightVec = normalize(LightPosition - ecPosition);
vec3 reflectVec = reflecU-lightVec. tnorm);
vec3 viewVec = normalize(-ecPosition):
float spec = max(dot(reflectVec. viewVec). 0.0):
spec = pow(spec, Shininess):

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