М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 98
Текст из файла (страница 98)
444 Глава 12 ° Вычислители и МОКВВ ставлены вершинами, цветовыми данными ВОВА, векторами нормалей или координатами текстур. Например, с помощью 6С ИАР1 СОСОК 4 вычислитель генерирует цветовые данные кривой в четырехмерном (ВОВА) цветовом пространстве. Вы можете также использовать значения параметров из табл.
12.1 для того, чтобы разрешить применение вычислителей перед их вызовом. Передача соответствующего значения в к1ЕпаЬ1еО или я10>'ваЬ(е() включает или выключает вычислитель. Аргументы ну и и2 указь>вак>т диапазон значений переменной и. Переменная шага по индексу (згпт[е) — зто количество значений с одинарной или двойной точностью в каждом блоке памяти.
Таким образом, она задает смешение между данными двух последовательных точек. Порядок оптег — зто степень многочлена плюс 1, он должен соответствовать количеству контрольных точек. указатель рот(з ссылается на первую координату первой контрольной точки. Для нашего примера нужно использовать СЛЕдуЮщуЮ СтруКтуру рО>ЛГВ> (6((1Оат *) (ЕкС11рО> П(В [8) . Х). Таблица 12.1.
Типы контрольных точек для д[Мар1*() Пояснение Параметр Одновременно могут использоваться несколько вычислителей. Так, если определены и активны вычислители 6( МАР1 ЧЕКТЕХ 3 и 6( ИАР1 СОСОК 4, вызовы 61Еча1Соого1О генерируют сразу позицию и цвет. Но одномоментно допустимо задействовать только один вычислитель для вершин, хотя определить можно оба, Аналогично, в текущий момент активен может быть лишь один вычислитель текстуры.
Вместе с тем вычислители могут быть задействованы для генерирования любого сочетания вершин, нормалей, цвета и координатных данных текстур. Если вы определите и включите более одного вычислителя одинакового типа, будет использоваться предполагающий большую размерность, Для обсчета уже определенного и активного одномерного отображения исполь- зуйте команду 61Еча1Соогп1* О. чо[т[ 01Еча1Соогп1[[с[)(ТУРЕ и); чо[т[ 61Еча1Соого1[Ы)ч(ТТРЕ "и); Запускают вычисления ранее определенных одномерных отображений.
Аргу- мент и — зто значение (или указатель на значение в векторной версии коман- ды) координаты области. 6( МАР1 ЧЕКТЕХ 3 6( МАР1 ЧЕКТЕХ 4 6( МАР1 ТКОЕХ 6( МАР1 СОСОК 4 6( МЯР1 МОКМА( 6( МАР1 ТЕХТОКЕ СООКО 1 6С МАР1 ТЕХТБКЕ СООКО 2 6( МАР1 ТЕХТОКЕ СООКО 3 с х-, у-, т-коордн наты вершин х-, у-, т- н и-коордннвты вершин Индекс цвета К, 6, В, А Координаты нормали в-коордннатв текстуры в- н 1-координаты текстуры в-, Ь н т-координаты текстуры вьт-, г- н сгкоордннаты текстуры Вычислители 445 В процессе вычисления для обрабатываемых вершин генерируются значения цвета, индекса цвета, векторов нормалей и координат текстур.
Вызовы к! Е ча1Соо гб" () не используются для текущих значений всех упомянутых данных. Команда 1!Еча1Соогб*() не изменяет текущие значения. Определение равноотстоящих координат в одном измерении Вы можете использовать к(Еча!Соогб1() с любыми значениями и, по на практике чаще применяются равноотстоящие (эквидистантные), как в листинге 12.1. Чтобы получить такие значения, определите одномерную сетку с помощью х!Иар6г1б1'() и тогда уже применяйте к ней к!Еча1МезН1(). | чо1г! я1Иарбг1б1(Я)(С(.!и! п, ТУРЕ и1, ТУРЕ и2); Определяет сетку между значениями и1 и и2 с шагом п, то есть зквидистантную. чо!б В! Еча1Иезп1(С!.епшп тес(е, С!1пг р1, С(лп! р2); Применяет текущую определенную сетку ко всем включенным вычислителям.
Режим тоЫе выбирается из двух: 6с Р01ИТ или 6( (1ИЕ, в зависимости от того, как вы хотите нарисовать кривую — точками или соединительными линиями. Этот вызов действует так же, как В! Еча1Соо гб1() для каждого шага отр1до р2 включительно, где 0 <р1, р2 < п. Программно это зквивалентно коду В!ВеВ1п(6( Р01ЙТ5); /' ипи к!Век1п(6( (1ИЕ 5ТВ1Р); */ 1ог (! = р1; 1 <= р2; !++) к!Еча!Соогб1(о1 + 1*(о2-о1)/и); а!Епб(); стой лишь разницей, что, если Е = 0 или! = и, команда В! Еча)Сов гб1() вызывается со значениями и1 или и2. Двухмерные вычислители Действия в двух измерениях подобны одномерному случаю, за исключением тою, что все команды должны принимать лва аргумента — и н о. И, конечно, точки, цвета, нормали или координаты текстур должны относиться к поверхности, а не к кривой.
Математически фрагмент поверхности Безье представляется так: 5(и,п)=х ~х ~В,"(и)В, (п)Р„, -а,-о где Р, — это каждая из и ч и контрольных точек, а функции  — те же самые мноч гечлены Бернштейна для одного измерения. Как и раньше, значения Рь могут представлять вершины, нормали, цвета или координаты текстуры. Процедура использования двухмерных вьгчислителей подобна одномерному случаю. 1. Определите вычислитель(-и) с помощью к1Иар2* (). 2. Включите их передачей соответствующего значения в е!Епаб!е(). 3. Вызовите их посредством В!Еча1Соогб2() (между к!Вее1п() и В!Епб()) или указанием и последующим применением сетки с помощью к!Иар6г1б2() и а!Еча!Мезв2().
446 Глава 12 ° Вычислители и М()яви Определения двухмерного вычислителя и вычисления для него Используйте команды к1Мар2» () и к1Еча1Соога2* () для определения и вызова двухмерных вычислителей. чо]г[ я1нар2(Ы](С].епшп Гагйед ТУРЕ ит, ТУРЕ и2, С].шг изтг[г[е, С].[п( иогг]ег, ТУРЕ от, ТУРЕ а2, Сйш1 ш(г[ае, С].[п[ аогг[ег, ТУРЕ рот(з) Аргумент гагяег может принимать значения из табл. 12.1, с той разницей, что подстрока МАР1 замещается на МАР2. Как и прежле, эти значения также используются с к1Епап[е() лля включения соответствукяцего вычислителя.
Минимальное и максимальное значения и и а задаются как и1, и2, пТ и п2. Независимые аргументы изтгЫе и шйЫе задают количество значений с одинарной и двойной точностью между значениями переменных, позволяя пользователю выбрать прямоугольник контрольных точек из болыпего массива. Например, если данные представлены в виде 6С(1оаг ст1ро! птз [100] [100] [3] и вы хотите использовать поднабор 4 х 4, начинающийся с с(1ро! пгз [20] [39], установите изтги]е равным 100* 3 и штг[г[е равным 3. Начальная точка, ро[птж должна быть задана как Ьс 11ро! п та [20] [30] [0]. Наконец, порядки иогг]еги гоп[ег могут быть различны; тем самым поверхность можно «сшивать» одновременно, например, из кубических и квадратичных лоскутов. чон] я1Еча1Соога2([г])(ТУРЕ и, ТУРЕ г); чо[г1 БТЕча1Соога2(Ы)ч(ТУРЕ "иа]иез); Запускают вычисления лля определенных ранее двухмерных отображений.
Аргументы и н а — это значения (или указатели на значения и и а в векторной версии команды) координат области. Если включены вычислители для вершин(61 МАР2 ЧЕМТЕХ 3 или 6С МАР2 НЕКТЕХ 4), нормаль к поверхности вычисляется аналитически. Эта нормаль связывается со сгенерированными вершинами, когда активна автоматическая генерация нормалей, включаемая передачей константы 6С АОТО НОРМА( в Б1Епав[е(). В противном случае для порождения нормали используется соответствующее доступное отображение. Если такого отображения нет, используется текущая нормаль. Пример: поверхность Безье Программа из листинга 12.2 рисует каркас поверхности Безье с помощью вычислителей, выглядящий так, как на рис. 12.2.
В атом примере поверхность образуется девятью кривыми линиями в каждом направлении. Каждая кривая рисуется 30 отрезками. Для получения законченной программы лобавьте в пример процедуры гезЬаре() и ва! и() из листинга 12.1. Рис. 12.2. Поверхность Безье Вычислители 447 Листинг 42.2. Поверхность Безье: Ьегвог(.с ОС!1оаг стг1Ро«п(5(4](4)(3] = ( ((-1.5, -1.5, 4,8), (-8.5, -1.5, 2,0), (0.5, -1,5, -1.0), (1.5, -1.5, 2.0)), ((-1.5, -0.5, 1.8), (-0.5, -6.5, 3.8), (8.5, -8.5, 9.8), (1.5, -0.5, -1.0)), ((-1.5, 0.5, 4.0), (-6.5, 0.5, 0.6>, (8,5, 0.5, 3.6), (1.5, 6.5, 4.0)), ((-1.5, 1.5, -2.0), (-0.5, 1.5, -2.0), (0.5.
1.5, 0.8), (1.5, 1.5, -1.6)] чо«б б!«р1ау(чо«б> ( (пг «, 1: В)С>еаг(ас СОСОа ВОРРЕВ В)т ] ВС ОЕРтН ВОРРЕВ В)т>; В>Со>огз((1.8, 1.О, 1.О>; В(Роаьна(г!х О; 61аотагет(95.8, 1.0, 1.9, 1.0); (ог (> = 8; > <= В; )++) ( 81еее!п(ес ШИЕ 5ТК)Р>; таг (! = 9; ! <= 39; «+«) В)Еча>соогбзг((осшоа(>«/ЗО.Е, (ОС((о»1>1/В.О>; 61Епб(); 618«В«п(ОС С)НЕ 5та)Р>; Гог (! = 0; ! <= ЗО; !++) 61Еча1соогб2(((ОС«1оа()1/В.е, (01(1оат>«/36.8); 61Епб(),' В(Рорна(г«х(); В>Р(оан(>; ) чо(б !п«1(чо«б) 91С1еагСо1ог(0.0, 0.8, 9.8, 9.0); В>Марг((ВС МАР2 нватЕХ З, О. 1, З, 4, О.
1, ш, 4, астг>ро!пта(8) (8) (9)>. 61Епаб)е(вс НАР2 НЕКТЕХ 3); 61иарвг«02«(26, 0.0, 1.0, 20. 0.9, 1.6); В)Епао>е(вс ОЕРти тввт>; 615набенобе)(вс Р!.АТ); Определение равноотстоящих координат в двух измерениях «Двухмерные» команды 81нарбг! 02* () и 81Еча1Мезн2 О подобны «одномерным» версиям, с той разницей, что первые оперируют двумя переменными — и и О, чо?<? 81нарбг! 02(ИНС??п( пи, Т]РЕи1, ТУРЕи2, С?апг по, ТУРЕ 01, ТУРЕ 02); чо?с? а1Еча1невн2(С?.епцш тоНе, С??п1 !1, С??п1 !2, С??п(11, С?ап1/2); Определяет двухмерную карту сетки, от и1 до и2 с шагом пи, и от 01 до 02 с шагом ло (81МарБ г ! б2' () ), а затем эта сетка применяется ко всем включен- 443 Глава 12 ° Вычислители и ИОКВ5 ным вычислителям (В1еча1иеял2 () ). единственное существенное отличие от одномерного варианта в том, что для В1Еча1Иезл2 () аргументом тог/е можно задать константу 6С Р1СЕ, а не только 6С Р01МТ или 6Е Е1МЕ.
Эта константа вызывает генерирование закрашенных полигонов с помощью примитивов четырехугольной сетки. Если говорить точнее, В1Еча1Иеяп2() — ближайший эквивалент одного из следующих трех фрагментов кода. (По той причине, что, когда ! равна пи или / — ло, параметр точно равен и2 или 02, но не и!+ ли х (и — и1)//ли, которое может несколько отличаться вследствие ошибки округления.) 818еВ!п(6С Р01МТ5); /* режим == 6С Р01МТ '/ !ог (! = пи1; ! <= пи2; (++) гог (1 = пч1; 1 <= пч2; )++) 81Еча1Сооги2(и1 + )*(и2 - и1)/пи, ч1 + 1'(ч2 — ч1)/пч); 51Епо(); или гог (! = пи1; ! <= пи2; з++) ( /* режим == 6С (1МЕ '/ 818еа(п(6( (1МЕ5); Тог () = пч1; 1 <= пч2; )'++) В)еча1Соого2(и1 + ! *(и2 - и1) /пи, ч1 + ) '(ч2 - ч1) /пч); 81ЕпоО; гог (1 = пч1; 1 <= пч2; 1++) ( 818еа(п(6С (1МЕ5); гог (! = пи1; ! <= пи2; (++) 81Еча1Сооги2(и1 ч (*(и2 — и1)/пи, ч1 + 1*(ч2 — ч1)/пч).' 81Епи(); ) или !ог (! = пи1; ! < пи2; !«) ( /" Режим == 6С Р166 */ 81веа(п(6( ООАО 5ТВ1Р): гог (1 = пч1; ) <= пч2; 1++) ( 81Еча1сооги2(и1 + !'(и2 — и1)/пи, ч) + )'(ч2 — ч1)/пч); 81Еча1Соого2(и1 + (!+1)*(и2-и1)/пи, ч)<1*(ч2 — ч1)/пч); В1Епи(); ) Листинг 12.8 показывает различия, которые нужно внести в листинг 12.2, чтобы нарисовать поверхность Безье, используя 81Иар6г!02() и В!Еча1Иезв2() для разбиения квадратной области на равномерную 8 х 8 сетку.