Наш сайт создан для любителей и профессионалов, для тех кому не безинтересна система под названием Linux. На нашем сайте вы найдете статьи от установки до программирования на Linux'e, отзывы о системе, советы и поддержка начинающим пользователям. Для новичком, доступен раздел "Запускаем Linux", в котором рассказывается все от "упаковки", до первого включения системы.Новое на сайте
- Механизм приоритетов
- Функция giTeximage3DEXT
- Расширение EXT_texture3D
- Трехмерные (3D) текстуры
- Реализация проектора при помощи кубической карты
- Применения кубической текстуры
- Режим GL_CLAMP_TO_EDGE
- Способы задания текстурных координат
- Текстурные координаты
- Константы, однозначно идентифицирующие текстуру
- Расширение ARB_texture_cube_map
- Расширение ARBtextureenvcombine и мультитекстурирование.
- Наложение текстуры детализации
- Сложение текстур с коэффициентом
- Управление силой отражения при помощи текстуры
- Задание параметров операндов
- Операнды ArgO, Argl и Arg2
- Расширения EXT_texture_env_combine и ARB_texture_env_combine.
- Расширение ARB_texture_non_power_of_two
- Расширение EXT_texture_filter_anisotropic
- Устранение ошибок дискретизации
- Расширения EXT_bgra и EXT_abgr
- Предпочтения для способазадания промежуточных текстур
- Расширение SGIS_generate_mipmap
- Пирамидальное фильтрование
- Пример работы с ARBtextureborderclamp
- Расширения ARB_texture_border_clamp и EXT_texture_edge_clamp
- Расширения EXT_secondary_color и EXT_separate_specular_color
- Цвет блика на поверхности
- Закон GL_LINEAR
- Функции расширения GLEXTfogcoord
- Расширение EXT_fog_coord
- Процесс наложения тумана
- Расширения EXT_texture_env_add и ARB_texture_env_add
- Наложение карт освещенности при помощи мультитекстурирования
- Карты освещенности
- Файл IibTexture.h
- Основы использования библиотек libExt и libTexture
- Задание текстурных координат с помощью двух текстурных блоков
- Пример задания двух текстурных модулей
Рубрики
Архив
Прочее
Механизм приоритетов
Говорилось о: видеопамять, двумерные текстуры, трехмерные текстуры
Для трехмерной текстуры допустимо также пирамидальное фильтрование (mipmapping), однако для этого потребуется явно задать все необходимые промежуточные уровни аналогично тому, как это происходит для одно- и двумерных текстур. Обратите внимание на то, что если в одном и том же текстурном блоке одновременно разрешены текстуры разных типов, то работает механизм приоритетов: наиболее приоритетной текстурой является кубическая текстурная карта, затем в порядке убывания приоритета идут трехмерная, двумерная и одномерная текстуры.
He забывайте, что трехмерные текстуры (в отличие от одномерных и двумерных) занимают гораздо больше памяти (так трехмерная RGBA-текстура размером 256×256x256 занимает 64 Мбайт видеопамяти), поэтому их использование может отрицательно сказаться на быстродействии программы. Далеко не все форматы изображений поддерживают хранение трехмерных текстур. Наиболее подходящими для работы с ними являются DDS-файлы.
Функция giTeximage3DEXT
Говорилось о: height, target, width
Непосредственное задание трехмерной текстуры осуществляется при помощи функции giTeximage3DEXT, пример вызова которой выглядит следующим образом: void glTexImage3DEXT ( GLenum target, GLint level, GLenum internalformat,GLsizei width, GLsizei height, GLsizei depth,GLint border, GLenum format, GLenum type,const GLvoid * pixels ); Здесь в качестве параметра target выступает константа GL_TEXTURE_3D_EXT, параметры width, height и depth задают размер задаваемой текстуры в текселях по каждому измерению. Параметры level, internalformat, border, format и type полностью аналогичны соответствующим параметрам функций glTexImagelD И glTexImage2D. Для правильного задания трехмерной текстуры при помощи функции giTeximage3DEXT текселы, расположенные в буфере по адресу pixels, должны быть организованы как набор из depth прямоугольных текстур размером width на height текселов. При помощи параметров GL_UNPACK_ROW_LENGTH и GL_UNPACK_ALIGNMENT можно задать расположение текселов для каждой из этих прямоугольных текстур.
Расширение EXT_texture3D
Говорилось о: EXT_texture3D, giTeximage3DEXT, GL_TEXTURE_3D_EXT
Изначально поддержка трехмерных текстур в OpenGL была реализована при помощи расширения EXT_texture3D, потом, начиная с версии 1.2, она вошла в стандарт OpenGL. Расширение EXT_texture3D позволяет приложению создавать и использовать в OpenGL трехмерные текстуры, которые представляются трехмерными матрицами текселов размером widthxheightxdepth. Расширение EXT_texture3D вводит новую функцию giTeximage3DEXT, позволяющую задавать трехмерные текстуры, а также ряд констант, необходимых для работы с ними.
Самой важной из вводимых констант является GL_TEXTURE_3D_EXT, выступающая в качестве типа текстуры в обращении к функциям giEnabie, glDisable, gllsEnabled, glGetTexImage и glGetTexParameter. Также вводится константа GL_MAX_3D_TEXTURE_SIZE_EXT, позволяющая получить максимальный размер трехмерной текстуры. Для этого служит следующий фрагмент кода: int maxSize; glGetlntegerv ( GL_MAX_3D_TEXTURE_SIZE_EXT, SmaxSize ); Поскольку при обращении к трехмерной текстуре необходимы все три текстурные координаты (s, t, г), то вводится константа GL_TEXTURE_WRAP_R_EXT, позволяющая задать закон приведения координаты г в отрезок [0, 1].
Трехмерные (3D) текстуры
Говорилось о: shader, процедура, функция
Текстура представляет собой удобный способ задания функции нескольких переменных. Функция одной переменной легко задается при помощи одномерной (ID) текстуры, двух — двумерной, функция направления в трехмерном пространстве — при помощи кубической текстурной карты. При этом сложность задаваемой функции не играет практически никакой роли. После того как функция была задана при помощи текстуры, работа с ней происходит одинаково легко вне зависимости от сложности исходной функции. Механизм линейного фильтрования OpenGL фактически является способом полилинейного (в зависимости от типа текстуры) интерполирования значений текселов на все точки единичного отрезка (квадрата, сферы). Данное обстоятельство активно используется при написании сложных шейдеров ((shader) — процедур закрашивания граней. За счет этого удается в ряде случаев обеспечить довольно сложные законы рендеринга, реализация которых путем прямого вычисления соответствующих функций либо вообще невозможна, либо слишком громоздка с вычислительной точки зрения. Однако в ряде случаев (с некоторыми из них мы столкнемся позже) возникает необходимость определения функции трех независимых переменных. Это естественным образом приводит к понятию трехмерной (3D) текстуры.
Реализация проектора при помощи кубической карты
Говорилось о: источник, освещенность, проектор
Рассмотрим, каким образом можно реализовать источник света ((проектор) при помощи кубической карты. Для проектора освещенность зависит от направления на источник, т. е. является функцией направления и поэтому может быть представлена при помощи кубической текстурной карты. Пусть источник света расположен в точке light. Тогда для произвольной вершины Vj в качестве текстурных координат для кубической карты, задающей распределение освещенности, возьмем значения согласно формуле(s, t, г) = Vi – light.
Затем каждой точке произвольной грани сопоставим текстурные координаты на карте освещенности, т. е. зададим падающий на нее свет. Исходя из этого, мы можем реализовать освещение таким проектором следующим образом: 1.В нулевом текстурном блоке мы разместим обычную двумерную текстуру объекта и зададим закон наложения GL_REPLACE. 2.В первом текстурном блоке мы разместим: кубическую карту, задающую распределение освещенности. В качестве закона наложения выберем GLJMODULATE, текстурные координаты будем задавать по формуле.Если мы при этом хотим задавать не только положение источника света в пространстве, но и его ориентацию, то это легко можно сделать при помощи матрицы преобразования текстурных координат. Ориентация объекта в пространстве может быть задана при помощи ортогональной матрицы (или трех углов Эйлера, или кватерниона). Тогда, если задать в качестве матрицы преобразования текстурных координат транспонированную матрицу ориентации (для ортогональных матриц транспонированная совпадает с обратной), то этого будет достаточно для моделирования ориентации источника света.
Применения кубической текстуры
Говорилось о: вектор, источник света, направление
Кубическая текстура позволяет в простой и удобной форме задавать функции от направления. Каждому направлению естественным образом соответствует точка на кубе, поэтому достаточно просто задать значения функции в виде текстур на гранях данного куба. Еще одним возможным применением кубической текстуры (мы с ним столкнемся позже, когда будем рассматривать попиксельное освещение) является нормализация векторов. Единичному трехмерному вектору можно легко сопоставить значение компонент RGB. Но при интерполяции и других простых операциях с подобными значениями (векторами) у нас могут получиться ненормированные результаты (непригодные для уравнения освещенности). Кубическая текстура предоставляет простой способ нормализации. Другим примером является задание источника света в виде проектора, когда сила света (и его цвет), падающего в точку, зависит от направления из этой точки на источник. Кубическая текстура в этом случае позволяет в легкой и удобной форме задать подобный проектор.

