Методы, подобные описанным выше, можно использовать для масштабирования блока пикселей. Области пикселей в исходном блоке масштабируются с использованием заданных значений ях и ву, а затем отображаются в целевые пиксели. Цвет каждого целевого пикселя определяется согласно области, занимаемой накладывающимися масштабированными областями пикселей (рис. 5.29).
Чтобы отразить объект, можно использовать растровые преобразования, обращающие значения строки или столбца блока пикселей, дополненные трансляцией. Сдвиги получаются путем смещения положений элементов массива по строкам или столбцам.
РАСТРОВЫЕ ПРЕОБРАЗОВАНИЯ В OpenGL
Большинство функций OpenGL для выполнения растровых операций вводилось в разделе 3.19. Трансляцию прямоугольного массива кодов цвета, соотнесенных с пикселями, из одной области буфера в другую в OpenGL можно выполнить как операцию копирования:
glCopyPixels (xmin, ymin, width, height, GL_COLOR); В первых четырех параметрах этой функции указываются положение и размеры блока пикселей. Символьная константа OpenGL GL_COLOR определяет, что копироваться должны коды цвета. Данный массив пикселей будет скопирован в прямоугольную область буфера регенерации, левый нижний угол которой задается текущим растровым положением. Коды цвета, соотнесенные с пикселями, копируются либо как RGBA-значения, либо как индексы таблицы цветов в зависимости от текущих настроек режима цвета. Отметим, что копируемая область (источник) и целевая область принадлежат диапазону изменения экранных координат. Данная трансляция может выполняться в любом буфере OpenGL, используемом для обновления экрана, или даже между различными буферами. Исходный буфер, указываемый в функции glCopyPixels, выбирается с помощью процедуры glReadBuf fer, а целевой буфер - с помощью процедуры glDrawBuffer.
Чтобы повернуть блок кодов цвета на угол, кратный 90°, блок вначале записывается в массив, затем элементы массива переупорядочиваются и помещаются обратно в буфер регенерации. Как показывалось в разделе 3.19, блок RGB-кодов в буфере можно записать в массиве с помощью такой функции
glReadPixels (xmin, ymin, width, height, GL_RGB,
GL_UNSIGNED_BYTE, colorArray); Если в точках, отвечающих пикселям, хранятся индексы таблицы цветов, вместо константы GL_RGB используется константа GL_COLOR_INDEX. Чтобы повернуть набор кодов цвета, строки и столбцы массива цветов переупорядочиваются так, как описывалось в предыдущем разделе. Затем повернутый массив возвращается в буфер с помощью команды
glDrawPixels (width, height, GL_RGB, GL_UNSIGNED_BYTE, colorArray); Левый нижний угол этого массива помещается в текущее растровое положение. Исходный буфер, содержащий первоначальный блок значений пикселей, задается с помощью команды glReadBuf fer, а целевой буфер задается командой glDrawBuffer.
Двухмерное преобразование масштабирования можно выполнить как растровую операцию в OpenGL, задав масштабные коэффициенты, а затем вызвав процедуру д1СоруР1хе1з или дЮгаюР1хе1з. Масштабные коэффициенты растровой операции задаются следующим образом: