1. Прикладной интерфейс для работы с текстурой
2. Применения текстурирования
Литература

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

Наложение текстуры или текстурирование (texture mapping) - это метод, посредством которого на поверхность объекта накладывается некоторое изображение, называемое изображением текстуры. Простота идеи метода наложения текстуры весьма обманчива, поскольку в общем контексте конвейера визуализации этот метод открывает нетривиальные возможности. Перечислим некоторые области, где применение текстур оказывается весьма полезным:

  • текстуры можно использовать для того, чтобы показать материал, из которого сделан объект. Например, на обычный параллелепипед наносится зернистая картина среза дерева и он становится деревянным брусом;
  • на поверхность может быть нанесена картина закрашенных повторяющихся прямоугольников и поверхность превращается в стену, сложенную из кирпичей;
  • с помощью текстурирования можно наглядно представить физические свойства объектов в приложениях научной визуализации. Например, данные о температуре кодируются цветом и наносятся на объект, позволяя видеть, как геометрия влияет на протекание процессов теплопереноса.
  • текстуры дают возможность моделировать световые эффекты, например отражение, при создании фотореалистичных изображений;
  • наложение текстуры нашло применение в такой серьезной задаче, как рендеринг объемов. Подробнее об этом можно узнать, например, из статьи [1].
  • Проблемы, решаемые с помощью текстурирования обычно можно преодолеть и другими способами, например путем прямой модификации цвета объекта. Существенны, однако, два обстоятельства. Во-первых, разделение процедур создания геометрии, закраски и нанесения текстуры отражает существо дела, а тот прикладной интерфейс для работы с текстурой, который предоставляется современными графическими пакетами, делает работу с текстурами прозрачной, не приводящей к усложнению процесса программирования. Во-вторых, геометрические ускорители современных графических рабочих станций устроены так, что для поддержки текстурирования выделяется отдельная аппаратура, часто реализованная на специальных платах и включающая память для хранения текстурных изображений и свой процессор. В результате, текстурирование выполняется при рендеринге отдельным аппаратным конвейером, который работает параллельно с геометрическим. При наличии таких аппаратных средств накладные расходы на текстурирование малы и скорость рендеринга практически не уменьшается.

    Возможности графической системы по работе с текстурой стали сегодня важнейшими показателями производительности компьютера - можно сказать, что сражение на рынке графических систем сместилось в область текстуры. Основными характеристиками по работе с текстурой являются память и скорость. В новых настольных графических системах HP Visualize-48 объем памяти текстуры наращивается до 16 Мбайт. Иной подход применен в недавно выпущенных SGI графических станциях O2. Здесь память для текстуры выделяется динамически из общего пула основной памяти, поэтому ограничения становятся еще менее жесткими. Скорость нанесения текстуры в стандартных тестах графической производительности измеряется количеством треугольников с текстурой в секунду. Например для HP Visualize-48XP этот показатель составляет 800 тыс./с.

    1. Прикладной интерфейс для работы с текстурой

    Современные прикладные программные интерфейсы (API) для 3D визуализации, такие, как PEX или OpenGL, строятся на сходных базовых принципах, важнейшим из которых является представление о графическом конвейере. Поэтому рассматривая вопросы, связанные с программированием текстуры в контексте графического конвейера, мы будем использовать для определенности обозначения API OpenGL.

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

    Трехмерная сцена строится как совокупность геометрических объектов: точек, отрезков прямых и многоугольников - полигонов. Геометрически все объекты определяются одинаково - путем задания координат вершин. Криволинейные объекты, например сфера, аппроксимируются полигональной сеткой, состоящей из многоугольников с заданными вершинами. В OpenGL построение объекта начинается с обращения к функции glBegin, единственный параметр которой определяет тип объекта, например, GL_POLYGON для многоугольника. Вершины генерируются функциями glVertex, в которых задаются значения координат. Завершение описания объекта фиксируется путем обращения к функции glEnd.

    Кроме геометрических характеристик, внутри скобки glBegin - glEnd для каждой вершины определяется нормаль к поверхности, цвет и координаты текстуры. Нормаль используется для расчета освещенности полигона. Цвет может задаваться красным, зеленым, синим и альфа компонентами в модели RGBA. Координаты текстуры служат для выбора участка изображения текстуры, который будет отображаться на полигон. Псевдокод, порождающий отрезок прямой, выглядит следующим образом:

    glBegin (GL_LINES);
            glNormal (<координаты нормали>);
            glColor (<компоненты цвета>);
            glTexCoord(<координаты текстуры>);
            glVertex (<координаты вершины>);
            glNormal (<координаты нормали>);
            glColor (<компоненты цвета>);
            glTexCoord(<координаты текстуры>);
            glVertex (<координаты вершины>);
    glEnd();

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

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

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

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

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

    1.1 Изображение текстуры

    Изображение текстуры представляет собой массив элементов - текселей, очень похожих на обычные пиксели и имеющих аналогичный смысл. Этот массив может быть одно-, двух- или, в некоторых системах, трехмерным. Здесь, для определенности, мы будем говорить о двумерном массиве текселей. Отдельные элементы массива адресуются текстурными координатами (s,t), которые имеют фиксированный диапазон изменения [0.,1.]. Массив текселей объявляется изображением текстуры путем обращения к функции glTexImage. В качестве параметров, кроме массива текселей, задаются размеры массива - его ширина и высота, а также формат текселей. Поскольку диапазон текстурных координат фиксирован, размеры массива определяют реальные размеры текселей в пространстве окна - подробность текстуры. Собственно тексели представляют собой упакованную совокупность компонентов RGBA или один компонент - какие именно компоненты используются в данном массиве задается в формате текселей. При наложении текстуры цвет текселя смешивается с цветом элементов поверхности.

    1.2 Параметры текстуры

    С каждым изображением текстуры должны быть связаны параметры текстуры, определяемые в функции TexParameter и задающие способ отображения текселей на пиксели. Первая группа параметров TEXTURE_WRAP определяет, что делать, если какая-то из координат текстуры (s,t) выходит за диапазон [0.,1.]. Для каждой из координат можно задать свой способ действия. Возможны два варианта - CLAMP или REPEAT. В режиме CLAMP, если соответствующая координата текстуры выходит за единичный диапазон, текстура не накладывается. Этот режим применяется, когда нужно наложить изображение на объект в единственном экземпляре. Во втором из возможных режимов - REPEAT, используется всегда только дробная часть координаты и тем самым может быть создана повторяющаяся картина.

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

    Если область больше, чем один тексель (рисунок 1), текстура сжимается так, чтобы соответствовать пикселю экрана, для чего применяется фильтр сжатия. В противном случае, когда область меньше текселя, текстура расширяется и используется фильтр расширения (рисунок 2).

    Picture 1

    Рисунок 1.
    Сжатие текстуры.

    Picture 2

    Рисунок 2.
    Расширение текстуры.

    Можно определить один из следующих фильтров сжатия и расширения.

    NEAREST - при сжатии/расширении будет использоваться значение элемента текстуры, который является ближайшим к центру пикселя, на который накладывается текстура.

    LINEAR - будет использоваться взвешенное среднее 4 ближайших к пикселю элементов текстуры.

    Близость определяется по координатам текстуры, рассчитанным для пикселя.

    Кроме того, для фильтров сжатия можно использовать Mip-карты, - совокупность массивов, представляющих одно изображение с последовательно уменьшающимся разрешением. Если размер текстуры 2n х 2m , то имеется max(n,m)+1 Mip-карт. Первая карта - это исходное изображение. Каждая следующая карта имеет размеры 2k-1 х 2l-1 , где 2k * 2l - размеры предыдущей карты.

    Фильтры сжатия на основе Mip-карт различаются количеством используемых в них Mip-карт и способом получения значения текстуры.

    NEAREST_MIPMAP_NEAREST - выбирается Mip-карта, ближайшая к размеру текстурируемого пикселя, и в соответствие с режимом NEAREST выбирается значение текстуры.

    NEAREST_MIPMAP_LINEAR - выбираются две Mip-карты, которые наиболее близки по размерам к текстурируемому пикселю. Используется режим NEAREST для получения значения текстуры из каждой карты Mip. Окончательное значение текстуры получается, как взвешенное среднее этих двух значений.

    В обозначениях двух других фильтров на первом месте стоит LINEAR - это фильтры LINEAR_MIPMAP_NEAREST и LINEAR_MIPMAP_LINEAR. От предыдущих фильтров они отличаются тем, что для выборки значения текстуры из Mip-карт используется режим LINEAR.

    1.3 Параметры среды

    Средой текстуры, которая определяется в функции TexEnv, называют способ, по которому значения текстуры изменяют цвет и прозрачность закрашенных пикселей объекта. Основной способ определения параметров среды - задание одной из трех разных функций текстуры, обозначаемых MODULATE, DECAL и BLEND.

    Функция текстуры действует на текстурируемый фрагмент, используя значение, выбранное из изображения текстуры, применяет его к фрагменту и производит цвет RGBA для этого фрагмента. Способ композиции зависит от числа компонентов в текстуре. Функция MODULATE перемножает цвет пикселя и вычисленные значения текстуры, выдавая на выходе новый цвет пикселя, например, Cout=Cin*Ctex, где Cout, Cin, Ctex - компоненты цвета фрагмента на выходе, на входе и значение текстуры, соответственно. Функция BLEND производит смешивание цветов: Cout=(1-Ctex)*Cin+Ctex*Cenv. Здесь Cenv - дополнительно задаваемый параметр цвета среды. В функции DECAL цвета смешиваются с компонентом прозрачности текстуры.

    2. Применения текстурирования

    2.1 Цветовое кодирование свойств

    Машинная графика почти всегда имеет дело с многомерным миром. Проектирование изделия отнюдь не заканчивается построением его объемной модели. Дальше требуется провести технологические расчеты, определяя нагрузки, обтекаемость, распределение электрического потенциала. Таким образом, как правило, моделирование объектов и явлений сопряжено с задачей исследования связанных с моделью числовых данных, которые определяют одно или несколько свойств модели. Наличие нескольких свойств превращает 3D мир модели в мир большей размерности. Далее рассмотрим, каким образом можно наглядно изобразить числовые свойства с привязкой к порождающему их 3D объекту. Более формально эта задача называется визуализацией данных - числовых векторов, заданных на некотором подмножестве точек 3D пространства. Каждая компонента вектора (или канал) соответствует значению определенного свойства.

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

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

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

    Закраска Гуро сглаживает тоновый переход между ребрами полигонов, вычисляя путем линейной интерполяции цвет для каждого пикселя полигона. Сглаженная поверхность более естественно моделирует отражение света и делает визуализацию реалистичней. Модель закраски Гуро применяется, в качестве стандартного метода в OpenGL.

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

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

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

    Picture 3

    Рисунок 3.
    Цветовое кодирование. Справа цветовая интерполяция, слева - текстурная.

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

    2.2 Линии уровня на поверхности

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

    Нанесение линий уровня непосредственно путем задания цветов узлов сталкивается с той же проблемой резких цветовых переходов, что и цветовое кодирование. Решение, которое дает текстура, пригодно и в данном случае. Задается 1D текстура, заполненная базовым цветом, который выбран для изображения поверхности. В тех позициях изображения текстуры, которые соответствуют значению линии уровня, текселям присваивается цвет, выбранный для изолиний с данным порогом. На рисунке 4 показано применение текстуры для изображения гидрофобного потенциала молекулы Грамицидин А, в виде набора изолиний на ее поверхности.

    Picture 4

    Рисунок 4.
    Изолинии на поверхности молекулы. Варианты справа и слева различаются разным шагом порогов.

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

    2.3 Фильтрация информации

    Метод цветового кодирования свойств поверхности с помощью одномерной текстуры может быть легко обобщен на 2D или 3D. Такое обобщение позволяет одновременно показывать два или даже три свойства. Для этого каждому текселю многомерной текстуры требуется сопоставить свой цвет, который будет отображать каждую комбинацию значений свойств. В этом случае, однако, интерпретация цветовой палитры в смысле определения по цвету значений свойств может быть весьма нетривиальной или даже невозможной. Во всяком случае поверхность будет информационно перегружена.

    Одно из возможных и достаточно общих решений состоит в создании двумерной текстуры, в которой комбинируется 1D цветовой код и 1D карта порогов изолиний. А именно, текстура представляется 2D массивом изображения, который состоит из двух строк. Первая строка содержит цветовой код и соответствующие координаты используются для одного свойства, а вторая строка кодирует карту изолиний и используется для изображения второго свойства. В этом случае становится возможным изобразить одновременно два свойства на той же поверхности, обеспечивая возможность их четкого различения.

    В другом подходе одно свойство используется для фильтрации второго и результат изображается на поверхности. Наглядность повышается в двух аспектах:

  • фильтрация позволяет выделить важную информацию и устранить не имеющую большого значения,
  • фильтрация создает для качественной информации количественный контекст. К примеру, изображать значения свойства можно вместе со стандартным отклонением от среднего, чтобы дать представление о том, насколько точно представлено свойство в данной точке поверхности.
  • Иллюстрацией применения данного подхода служит совместное изображение электростатического потенциала (ESP) и липофильного потенциала молекулы (MLP) на доступной растворителю поверхности молекулы Грамидицин А. Электростатический потенциал показывает, как отдельные части молекулы могут взаимодействовать с другими молекулами, молекулярный липофилический потенциал дает хорошую оценку, в каких местах молекула контактирует с водой (липофобные области) или с мембраной (липофильные области). Сама молекула - это белок, образующий транспортные каналы. Он находится в мембранах биоорганизмов, регулируя транспорт молекул воды и ионов. На рисунке 5 приведено цветовое кодирование поверхности, доступной растворителю Грамицидина А, а также ESP, отфильтрованного с помощью MLP.

    Picture 5

    Рисунок 5.
    Изображение двух свойств на поверхности молекулы путем фильтрации.

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

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

    2.4 Построение произвольных сечений

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

    Развитием непрерывного изменения прозрачности поверхности является использование прозрачности для полного отсечения частей поверхности, в зависимости от значений свойства. Тем значениям, которые требуется отсечь, ставятся в соответствие тексели, у которых альфа-значения установлены в 0. Пример построения сечения поверхности молекулы Грамицидин А приведен на рисунке 6.

    Picture 6

    Рисунок 6.
    Сечение поверхности.

    2.5 Высококачественный рендеринг поверхностей

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

    На рисунке 7 дана иллюстрация этой проблемы на простом примере: сфера слева демонстрирует типичный артефакт метода Гуро, справа на эту же сферу наложена сетка, показывающая разбиение ее поверхности. Сравнение этих изображений наглядно демонстрирует, как генерируется сфера в линейной аппроксимации. При вращении сферы световые блики начинают осцилировать в зависимости от того, насколько близко расположена нормаль к поверхности в самой яркой вершине к источнику света.

    Picture 7

    Рисунок 7.
    Закраска по методу Гуро.

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

    2.6 Закраска Фонга в реальном времени

    С помощью наложения 2D текстуры становится возможным достигнуть одновременно высокой скорости рендеринга и очень высокой точности закраски. Получаемые рисунки имеют качество модели Фонга с источниками света, находящимися на бесконечности. Идея состоит в использовании в качестве текстуры изображения сферы, полученного в результате рендеринга с высоким качеством. Нормаль объекта единичной длины служит текстурной координатой и используется, как указатель на массив изображения текстуры, в котором хранится предварительно вычисленная информация о закраске. Рассматривая отдельный треугольник полигональной поверхности, можно представить наложение текстуры, как заворачивание отдельных кусков-полигонов в идеально отрисованную сферу.

    Преимущества такой процедуры закраски очевидны (рисунок 8): интерполяция выполняется в пространстве текстуры, а не в цветовом пространстве и следовательно световые блики никогда не будут пропущены. Заметим, что степень разбиения сферы такая же, как и при закраске Гуро, показанной на рисунке 7. Этот метод рендеринга поверхностей может быть быть применен к объектам произвольной формы.

    Picture 8

    Рисунок 8.
    Закраска с помощью текстуры.

    На рисунке 9 показана 3D реконструкцию данных, полученных с помощью электронного микроскопа и воспроизводящих большой биомолекулярный комплекс.

    Picture 9

    Рисунок 9.
    Текстурная закраска, моделирующая метод Фонга.

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

    Заметим, что хотя приведенные иллюстрации взяты из молекулярно-биологических приложений [2], сами методы, безусловно, имеют универсальный характер.

    2.7 Отражение среды

    Отражение среды - это впечатляющий прием нелинейной компоновки нескольких изображений, который часто применяется в дизайне и на телевидении. На визуализируемый объект, например, на блестящий корпус автомобиля, накладывается окружающая обстановка: небо, облака, деревья, расположенные рядом предметы, создавая эффект отражения от криволинейной поверхности.

    Данные эффекты могут быть получены с помощью текстуры следующим способом. Требуется шесть текстурных изображений, каждое из которых представляет собой снимок среды в направлении одной из 6 граней куба. В узлах полигональной поверхности, на которую накладывается среда, вычисляется вектор отражения, направленный от глаза наблюдателя к поверхности. Вектор отражения индексирует одно из шести изображений текстуры. Если все вершины полигона порождают отражение на одно и то же изображение текстуры, то это изображение используется для текстурирования полигона. Если же полигон отражается в более, чем одну грань куба, тогда он делится на более мелкие куски. Из-за того, что вектор отражения вычисляется не на каждом пикселе, этот метод не точен, но результаты весьма убедительны, если полигоны достаточно малы. На рисунке 10 приведен пример использования метода отражения среды.

    Picture 10

    Рисунок 10.
    Комбинирование среды.


    Литература

    [1]. Р.Ягель, Аппаратный рендеринг объема. Открытые системы, 5, 96.

    [2]. M.Teschner, C.Henn. Texture Mapping in Technical, Scientific and Engineering Visualization. http://www.sgi.com/ChemBio /Resources/texture_article.html