УДК 004.92
МУЛЬТИТЕКСТУРИРОВАНИЕ С ПОМОЩЬЮ ШЕЙДЕРОВ
(Работа выполнена при финансовой поддержке РФФИ, проект № 10-07-00089-а, и ДВО РАН, проект № 12-1-ОНИТ-04)
Л.А. Федорищев, м..н.с. (Институт автоматики и процессов управления ДВО РАН, ул. Радио, 5, г. Владивосток, 690041, Россия, /1ео1987@таИ-ги)
Рассматриваются различные виды текстур, способы их визуализации и задачи программного создания, хранения и использования сложных текстур больших размеров, комбинированных многослойно-размноженных текстур, состоящих из нескольких слоев, имеющих подтекстуры, повторяющиеся по всей площади. Особое внимание уделено проблеме объемов памяти, необходимых для больших текстур, и способам решения этой проблемы. Описаны вершинные и пиксельные шейдеры и способы их применения для создания и использования программных текстур, показаны особенности шейдеров во Flash. Представлены способы решения поставленной задачи с помощью шейдеров для различных комбинаций входящих слоев подтекстур (повторяющиеся подтекстуры; текстуры, состоящие из двух слоев подтекстур; многослойные текстуры с повторяющимися подтекстурами) и предложены конкретные алгоритмы создания таких шейдеров и их практическая реализация на языке шейдеров AGAL во Flash. Приведен практический пример, наглядно показывающий преимущества использования представленных алгоритмов на шейдерах для экономии занимаемых объемов памяти в десятки и сотни раз. Данные алгоритмы могут применяться не только в шейдерах на языке AGAL для технологии Flash, но и в других технологиях, использующих шейдеры.
Ключевые слова: компьютерная графика, текстуры, шейдеры.
MULTITEXTURING WITH SHADERS
Fedorischev L.A., Junior Researcher (Institute of Automation and Control Processes Far Eastern Branch of RAS, 5, Radio St, Vladivostok, 690041, Russia, [email protected])
Abstract. Different types of textures and methods for texture visualization are considered. There are described problems of program creating, storing and using of complicated big textures, combined multilayer-tiling textures with subtextures repeated on whole area. Particular attention is given to the problem of the memory volume required for big textures and to the methods for the problem solution. Vertex and pixel shaders are described; ways of applying of shaders for creation and use of program textures are considered; features of Flash shaders are shown. There are demonstrated shader methods for the above mentioned problem for different combinations of input layers of subtextures (tiling subtextures, textures with two layers of subtextures, multilayer textures with tiling subtextures) and suggested the concrete algorithms of such shaders creation and their practical realization on the shader language AGAL in the Flash. At the end of the paper the practical example is demonstrated that shows all the advantages of using of the suggested shader algorithms for economy of the textures memory volumes for tens and hundreds times. Besides the considered algorithms can be applied at other shader technologies, not only in the Flash.
Keywords: computer graphics, textures, shaders.
В приложениях компьютерной графики (как для традиционных, так и для интернет-приложений) регулярно встречаются задачи создания различных текстур - растровых изображений, которые накладываются на поверхности трехмерных объектов. Разные типы текстур могут накладываться на объекты по-разному в зависимости от текстурных координат. Встречаются различные сложные специфические текстуры: составленные из нескольких других текстур, размноженные по поверхности, с применением масок по определенному цветовому ключу, а также комбинированные текстуры, обладающие свойствами сразу нескольких типов текстур (см. рис. 1).
Основная проблема, возникающая при работе с текстурами, - объемы памяти, необходимые для их хранения. При этом имеют значение объемы файла текстуры, текстуры в оперативной памяти (для ее обработки) и объем видеопамяти (для отображения текстуры). Объем памяти, занимаемой текстурой, зависит от различных параметров: размера (ширины и длины изображения), требуемого качества, количества слоев, повторяемости. Для простых многослойных и повторяющихся текстур
существуют стандартные способы их создания: многослойные текстуры без повторно используемых элементов готовятся в редакторах; текстуры с повторяющимся узором по всей поверхности создаются и накладываются в процессе визуализации
а) Многослойные текстуры
Sx4
б) Повторяющиеся текстуры
А +(н х4)=
в) Многослойные текстуры с повторяющимися элементами
Рис. 1. Схемы получения различных композитных текстур
с помощью тайлингового (бесшовного) повторения заданного шаблона. Однако для более сложных текстур не всегда удается найти оптимальный способ создания: трудно отыскать хорошее решение для многослойных текстур, в которых есть независимые, повторно используемые слои (можно найти хорошее решение для отдельных слоев, но не для всей текстуры); метод тайлингового наложения нельзя применить к большим текстурам с неповторяющимся узором.
Одним из возможных путей решения задач оптимизации хранения и использования текстур является мультитекстурирование на основе шейде-ров. Мультитекстурирование - это метод рендеринга с использованием нескольких текстур за минимальное число проходов [1], как правило, при помощи шейдеров. Шейдеры - короткие программы, которые выполняются непосредственно видеокартой и потому способны динамически и гибко осуществлять визуализацию [2-3].
В данной статье описываются способы применения шейдеров на языке AGAL во Flash для создания различных текстур, позволяющих, в частности, выполнять мультитекстурирование многослойных и повторяющихся текстур, а также многослойных разнородных текстур, в которых слои могут иметь разные параметры повторяемости.
Шейдеры во Flash
Данные шейдеры пишутся на специализированном языке AGAL [4-5] (в технологиях Microsoft DirectX используется подобный язык HLSL, в OpenGL - GLSL). По своей структуре и синтаксису AGAL очень напоминает ассемблер.
В AGAL есть вершинные и пиксельные шей-деры. В процессе рендеринга на каждом проходе графического конвейера вершинные шейдеры обрабатывают каждую вершину геометрии, пиксельные шейдеры - каждый пиксель. Рассмотрим более подробно пиксельные шейдеры.
Задача пиксельного шейдера - определить итоговое значение цвета пикселя на экране и передать эту информацию видеокарте. Пиксельный шейдер может получить цвет пикселя из текстуры и передать его дальше видеокарте, более того, перед отправкой он может обработать и изменить его. Таким образом, в процессе рендеринга можно динамически генерировать цвет любого пикселя необходимой сложной текстуры, то есть строить (или изменять) текстуру прямо в процессе визуализации.
Пиксельные шейдеры и многослойные текстуры
Пиксельные шейдеры могут получать на вход несколько (до 8) текстур. Это означает, что для каждого пикселя имеется несколько источников
данных о цвете. Для получения итогового цвета пикселя в шейдере эти данные из различных текстур можно смешивать и изменять произвольным образом. Для соединения нескольких полученных текстур в одну многослойную текстуру достаточно сложить значения цветов пикселей всех текстур с каким-либо параметром смешивания. Это и есть шейдерный способ создания многослойных текстур. Его отличие от других способов в том, что не нужно хранить итоговую текстуру в памяти, так как она строится шейдером из полученных составляющих текстур динамически, непосредственно в процессе визуализации.
На рисунке 2 показаны различные способы получения сложной текстуры: в редакторе, в прикладной программе, в шейдере.
Рис. 2. Методы получения сложной текстуры
Алгоритм построения двухслойной текстуры с помощью шейдера позволяет последовательно получить
- текстурные координаты пикселя;
- цвет пикселя из текстуры 1;
- цвет пикселя из текстуры 2;
- коэффициент смешивания текстур для данного пикселя (коэффициент можно задать заранее или вычислить динамически);
- итоговый цвет пикселя по формуле с=с1*(1-к)+с2*к, где с - итоговый цвет; с1 - цвет пикселя из 1-й текстуры; с2 - цвет пикселя из 2-й текстуры; к - коэффициент смешивания.
Соответствующий код программы на AGAL. Пусть в вершинном шейдере текстурные координаты помещаются во входном регистре val. Тогда передаем в переходный регистр v0 значение текстурных координат из регистра va 1:
mov v0, va1
В пиксельном шейдере получаем текстурные координаты, умножаем на коэффициент и помещаем результат в регистр ft2:
mov f2, v0
В регистр ft1 записывается цвет пикселя c1 из первой текстуры:
texft1, f2, fs1 <2d, linear, repeat
В регистр ft2 записывается цвет пикселя c2 из второй текстуры:
tex ft2, ft2, fs2 <2d, linear, repeat> В регистр ft1 записывается результат умножения цвета c1 на (1-k): mulftl, ftl, fcO.r
В регистр ft2 записывается результат умножения цвета c2 на k:
mulft2, f2, fcO.g
Итоговый цвет пикселя получается сложением полученных цветов:
add oc, ftl, ft2
Перед использованием данного шейдера, помимо другой информации, в него необходимо обязательно передать данные о текстурных координатах и коэффициенте смешивания в правильные регистры. Например, в движке Altemativa3D это можно сделать так:
drawUnit.setVertexBufferAt(1, uvBuffer, geomet-ry.attributesOffsets [VertexAttributes.TEXCOO-RDS[0]], VertexAttributes.FORMATS [VertexAttribu-tes.TEXCOORDS[Q] ]);
drawUnit.setFragmentConstantsFromNumbers (0, 0.4, 0.6);
Маски. По определению, маска - это текстура, в которой цвет каждого пикселя несет информацию о коэффициенте смешивания для других слоев. Таким образом, для создания многослойных текстур с масками можно с успехом применять вышеописанный алгоритм с той разницей, что коэффициент смешивания необходимо будет дополнительно получать еще из одной текстуры.
Пиксельные шейдеры и повторяющиеся текстуры
Повторяющиеся (тайлинговые) текстуры также можно создать с помощью шейдеров. Для получения информации о цвете пикселя шейдер использует текстурные координаты - двухмерные координаты пикселя на матрице текстуры. Текстурные координаты лежат в диапазоне от 0 до 1. В случае выхода за эти пределы значения модулируются. Благодаря возможности указывать (и менять) текстурные координаты в шейдере, можно получить цвет любой точки текстуры. Таким образом, чтобы получить повторяющуюся текстуру, достаточно умножить текстурные координаты каждого пикселя на нужные коэффициенты.
Алгоритм построения повторяющейся текстуры:
- из вершинного шейдера передать текстурные координаты пикселя;
- в пиксельном шейдере умножить полученные текстурные координаты на необходимый коэффициент;
- получить цвет пикселя из текстуры на основе умноженных текстурных координат: u2 = =u1*k1, v2=v1*k2, где (ul, vl) - исходные текстур-
ные координаты, (u2, v2) - измененные текстурные координаты, к1, к2 - коэффициенты повторения для каждой координатной оси. Соответствующий код на AGAL:
- в вершинном шейдере текстурные координаты помещаются во входном регистре va 1; передаем в переходный регистр v0 значение текстурных координат из регистра va 1:
mov v0, va1
- в пиксельном шейдере умножаем полученные текстурные координаты на коэффициент, который хранится в регистре fc0, и помещаем результат в регистр f0:
mul ft0, v0, fc0
- получаем результирующий пиксель из измененных текстурных координат:
texf0, f0, fs1 <2d, linear, repeat>
Пиксельные шейдеры и многослойные разнородные текстуры
Проблема создания многослойных разнородных текстур в том, что невозможно заранее подготовить текстуру, одна часть которой будет многократно повторена, а другая растянута. Однако шейдеры генерируют текстуру прямо в процессе визуализации, управляя каждым ее пикселем. Это позволяет решить проблему разнородности составных частей текстуры, так как их можно подготовить отдельно и сложить вместе в шейдере.
Основная идея алгоритма построения многослойной разнородной текстуры заключается в объединении двух вышеописанных алгоритмов. При этом повторение используется только для тех составных частей текстуры, для которых оно необходимо, а остальные остаются без изменения. Далее все слои каждого пикселя складываются и получается итоговый результат.
Алгоритм построения двухслойной разнородной текстуры:
- получить текстурные координаты пикселя;
- получить цвет пикселя из первой текстуры по неизмененным текстурным координатам;
- умножить полученные текстурные координаты на необходимый коэффициент повторения;
- получить цвет пикселя из второй текстуры на основе умноженных текстурных координат;
- получить коэффициент смешивания текстур для данного пикселя;
- получить итоговый цвет пикселя. Соответствующий код шейдера на AGAL: mov v0, va1
mov ft0, v0
texft1, f0, fs1 <2d, linear, repeat> mul ft0, v0, fc1
texf2, f2, fs2 <2d, linear, repeat> mul ft1, ft1, fc0.r mul ft2, f2, fc0.g add oc, ft1, ft2
Пример применения шейдера для создания многослойной разнородной текстуры покрытия улицы
Допустим, необходимо покрыть модель виртуальной улицы текстурой. Пусть покрытие улицы включает два основных текстурных элемента: земля и асфальт. Земля - базовое покрытие, асфальт - дорожное покрытие. Учитывая относительные размеры объектов улицы (например домов), сама улица может иметь достаточно большие абсолютные размеры и при этом неоднородную многослойную (земля и асфальт) текстуру покрытия. Если текстуры домов будут иметь размеры 1 000 на 1 000 пикселей, текстура улицы должна будет иметь размеры не менее 10 000 на 10 000 пикселей. Если делать такую текстуру заранее, то из расчета, что один пиксель занимает 3 байта (1 байт на каждый цветовой канал), ее объем составит 10 000x10 000x3=300 000 000 байтов = примерно 300 Мб. Это очень большой объем памяти для одной текстуры. Вероятно, для нескольких улиц памяти уже не хватит. С другой стороны, основные текстурные элементы (земля и асфальт) повторяются на площади всей улицы и могут иметь размеры, например, 100 на 100 или 100*100*3=30 000 байтов = 30 Кб. Размер маски для дорожного покрытия может занимать, например, 3*1 000*1 000 = 3 000 000 байт = 3 Мб. Общий размер составляющих элементов в данном случае будет равен 3 Мб + 30 Кб = 3 Мб. Используя шейдер при динамическом построении итоговой текстуры, нет необходимости тратить 300 Мб памяти для всей текстуры - достаточно только 3 Мб для ее частей. Применение шейдера в дан-
ном случае дает стократный выигрыш расхода памяти.
Таким образом, в статье были рассмотрены способы создания и визуализации разных видов текстур при помощи шейдеров AGAL. Предложен способ динамического генерирования сложной многослойной текстуры с повторением из составляющих элементов при помощи мультитекстури-рования на основе шейдеров AGAL. Данный способ может применяться не только в шейдерах на языке AGAL для технологии Flash, но и в других технологиях, использующих шейдеры.
Литература
1. Боресков А. Мультитекстурирование в OpenGL. URL: http://steps3d.narod.ru/tutorials/tutorial-3.html (дата обращения: 07.03.2012).
2. Боресков А. Разработка и отладка шейдеров. СПб: БХВ-Петербург, 2006.
3. Андреев И. XNA для начинающих. Пиксельный шейдер. Мультитекстурирование. URL: http://iandreev.wordpress. com/2010/08/30/xnamultitex/ (дата обращения: 07.03.2012).
4. Гончар С. Molehill шейдеры. URL: http://flastar.ru/blog/ flastarposts/1156 (дата обращения: 07.03.2012).
5. Тимур Гагиев. Пишем шейдер на AGAL. URL: http:// xproger.mentalx.org/archives/568 (дата обращения: 07.03.2012).
References
1. Boreskov A., Available at: http://steps3d.narod.ru/tutori-als7tutorial-3.html (accessed 07 March 2012).
2. Boreskov A., Razrabotka i otladka sheiderov [Development and debugging shaders], St. Petersburg, BHV-Petersburg, 2006.
3. Andreev I., Available at: http://iandreev.wordpress.com/ 2010/08/30/xnamultitex/ (accessed 07 March 2012).
4. Gonchar S., Available at: http://flastar.ru/blog/flastar-posts/1156 (accessed 07 March 2012).
5. Gagiev T., Available at: http://xproger.mentalx.org/archi-ves/568 (accessed 07 March 2012).
УДК 004.932.2
ПРОСТРАНСТВЕННАЯ ОБРАБОТКА НЕСИНХРОНИЗИРОВАННЫХ ВИДЕОПОСЛЕДОВАТЕЛЬНОСТЕЙ НА ОСНОВЕ РЕКТИФИКАЦИИ КАДРОВ
Д.И. Пьянков, аспирант (Сибирский государственный аэрокосмический университет им.. академика М.Ф. Решетнева, просп.. им.. газ. «Красноярскийрабочий», 31, г. Красноярск,, 660014, Россия, [email protected])
Рассматривается процесс обработки несинхронизированных видеопоследовательностей в задаче стереовидения, применяемый для точного построения стереопар, для анализа данных, полученных аэрофотосъемкой и спутниковой фотографией. Исследуется проблема построения стереовидеопоследовательности на основе несинхронизированных видеопоследовательностей, полученных в результате видеосъемки двух неоткалиброванных видеокамер. Предлагается алгоритм пространственно-временной коррекции стереовидеопоследовательностей, где временная обработка сцены видеопоследовательностей состоит из двухэтапной процедуры оценки движения: предварительной оценки движения методом сопоставления блоков и уточненной оценки на основе инвариантных моментов Ху и Зернике. Представлены этапы обработки некалиброванной стереопары. Приводятся основные методы выделения и сопоставления особенностей изображения, инвариантных к масштабированию и вращению. Рассмотрены алгоритмы оценки фундаментальной матрицы на основе эпиполярной геометрии, алгоритмы ректификации изображений, представляющие собой перенос двух плоскостей изображений в одну плоскость. Описываются алгоритмы построения карт