Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

RedBook

.pdf
Скачиваний:
18
Добавлен:
11.06.2015
Размер:
7.43 Mб
Скачать

glutInitWindowPosition(100,100); glutCreateWindow("Robot Arm"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop();

return 0;

}

3.10 Трансформационный реверс

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

Такой трансформационный реверс выполняется функциями gluUnProject() и gluUnProject4() из библиотеки утилит. Получая трехмерные оконные координаты преобразованной вершины и данные обо всех преобразованиях, которые влияли на нее, gluUnProject() возвращает объектные координаты вершины в пространстве. (Если диапазон глубины в вашем приложении иной нежели [0, 1], используйте функцию gluUnProject4().)

int gluUnProject (GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16],

const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz);

Отображает заданные оконные координаты (winx, winy, winz) в объектные координаты, используя преобразования, заданные видовой матрицей (modelMatrix), проекционной матрицей (projMatrix) и портом просмотра (viewport). Результирующие объектные координаты возвращаются в параметрах objx, objy и objz. Функция возвращает значение GL_TRUE, индицируя успех операции, или GL_FALSEв случае неудачи (например, при наличии необратимой матрицы). Эта операция не пытается отсечь координаты по границе порта просмотра или уничтожить значения глубины, не заданные командой glDepthRange().

В трансформационном реверсе существуют специфические сложности. Двумерная точка на экране реально может находиться где угодно на линии глубины в пространстве. Для возможности однозначного результата, gluUnProject() требует в качестве одного из своих параметров значение глубины в оконных координатах (winz), кроме того, это значение должно быть указано в терминах glDepthRange(). Для диапазона глубин по умолчанию вызов gluUnProject() с параметром winz=0.0 вернет координаты соответствующей точки на ближней плоскости отсечения объема видимости, а при winz=1.0 будет вычислена точка на дальней плоскости отсечения.

Пример 3-8 демонстрирует использование gluUnProject() для чтения позиции курсора

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

Пример 3-8. Обращение конвейера геометрической визуализации: файл unproject.cpp

#include <glut.h>

#include <stdlib.h> #include <stdio.h>

//Изменение размеров окна void reshape(int w, int h)

{

glViewport(0,0,(GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluPerspective(45.0,(GLfloat) w/ (GLfloat) h,1.0,100.0); glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

//Отображение

void display(void)

{

glClear(GL_COLOR_BUFFER_BIT); glFlush();

}

//Реакция на мышь

void mouse(int button,int state,int x, int y)

{

GLint viewport[4];

GLdouble mvmatrix[16], projmatrix[16];

//y – координата в OpenGL GLint realy;

//Возвращаемые объектные x, y, z координаты

GLdouble wx,wy,wz;

switch(button)

{

case GLUT_LEFT_BUTTON: if (state==GLUT_DOWN)

{

glGetIntegerv(GL_VIEWPORT,viewport); glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix); glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);

//viewport[3] - высоте окна в пикселях realy=viewport[3]-(GLint)y-1;

printf("Координаты в позиции курсора (%4d,%4d)\n",x,realy);

gluUnProject((GLdouble)x,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz); printf("Объектные координаты при z=0 (%f,%f,%f)\n",wx,wy,wz);

gluUnProject((GLdouble)x,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz); printf("Объектные координатыпри z=1 (%f,%f,%f)\n",wx,wy,wz);

}

break;

case GLUT_RIGHT_BUTTON: if (state==GLUT_DOWN)

exit(0);

break;

}

}

int main(int argc, char **argv)

{

glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(100,100);

glutCreateWindow("Reversing the Geometric Processing Pipeline"); glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMouseFunc(mouse);

glutMainLoop(); return 0;

}

В GLU версии 1.3 появилась модифицированная версия gluUnProject(). gluUnProject4() может обрабатывать нестандартные величины диапазона глубин и wкоординаты не равные 1.

int gluUnProject4 (GLdouble winx, GLdouble winy, GLdouble winz,

GLdouble clipw, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4],

GLclampd znear, GLclampd zfar, GLdouble *objx, GLdouble *objy, GLdouble *objz, GLdouble *objw);

В общем, эта команда выполняет операцию аналогичную glUnProject(). Отображает заданные оконные координаты (winx, winy, winz) в объектные координаты, используя преобразования, заданные видовой матрицей (modelMatrix), проекционной матрицей (projMatrix), портом просмотра (viewport) и диапазоном глубин znear и zfar.

Результирующие объектные координаты возвращаются в параметрах objx, objy, objz и objw.

Еще одной функцией из библиотеки утилит, связанной с gluUnProject() и gluUnProject4() является функция gluProject(). gluProject() имитирует действие конвейера визуализации. Получая трехмерные объектные координаты и все преобразования, которые влияют на них, gluProject() возвращает преобразованные оконные координаты.

int gluProject (GLdouble objx, GLdouble objy, GLdouble objz,

const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4],

GLdouble *winx, GLdouble *winy, GLdouble *winz);

Отображает заданные объектные координаты (objx, objy, objz) в оконные координаты с использованием преобразований, заданных видовой матрицей (modelMatrix), проекционной матрицей (projMatrix) и портом просмотра (viewport). Результирующие оконные координаты возвращаются в параметрах winx, winyи winz. Функция возвращает GL_TRUE в случае успеха и GL_FALSE в противном случае.

Замечание: Матрицы, передаваемые gluUnProject(), gluUnProject4() и gluProject() задаются в формате стандартном для OpenGL, то есть по столбцам. Вы можете использовать glGetDoublev() и glGetIntegerv() с параметрами

GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX и GL_VIEWPORT для получения текущей видовой матрицы, матрицы проекции и порта просмотра соответственно, а затем использовать полученные величины при вызове gluUnProject(), gluUnProject4()

или gluProject().

Глава 4. Цвет

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

4.1 Цветовое восприятие

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

длиной волны приблизительно от 390 нанометров (nm) (фиолетовый) до 720 nm (красный) покрывают все цвета видимого спектра, формируя цвета радуги (фиолетовый, синий, голубой, зеленый, желтый, оранжевый и красный). Однако наши глаза воспринимают множество цветов, которых нет в радуге например, белый, черный, коричневый, розовый и так далее. Каким образом это происходит?

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

Человеческий глаз воспринимает цвет, когда несколько ячеек в сетчатке (называемых колбочками) возбуждаются вследствие того, что по ним бьют протоны. Три различных типа колбочек лучше реагируют на три различных длины световой волны: первый тип лучше реагирует на красный свет, второй на зеленый, и третий на синий. (У человека, не способного различать цвета, как правило, отсутствует один из типов колбочек.) Когда смесь протонов попадает в глаз, колбочки сетчатки регистрируют различные уровни возмущения в соответствии со своим типом. Если после этого в глаз попадает иная смесь протонов, возмущающая его с уровнем идентичным первой смеси, то цвет этих двух смесей неразличим.

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

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

Для отображения конкретного цвета, монитор посылает точное количество красного, зеленого и синего света (red, green, blue – RGB) должным образом стимулирующее различные типы колбочек в глазу. Цветной монитор может посылать свет с разными пропорциями красного, зеленого и синего в каждую точку экрана, и глаз видит миллионы световых точек, каждая из которых имеет свой собственный цвет.

Замечание: Помимо RGB существует множество других представлений цвета или цветовых моделей, обозначаемых как HLS, HSV, CMYK и так далее. Если вам требуется, чтобы цветовые данные были записаны в одном из этих форматов, вы всегда можете конвертировать их из RGB – формата или в RGB – формат.

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

4.2 Цвет в компьютере

Аппаратура заставляет каждый пиксель экрана излучать различные количественные соотношения красного, зеленого и синего света. Эти количества называются R (красный), G (зеленый) и B (синий) – величинами. Они часто хранятся и упаковываются вместе (иногда вместе с четвертой альфа величиной или альфа компонентой, называемой A), и упакованное значение называется RGB (или RGBA) величиной. Цветовая информация для каждого пикселя может храниться как в RGBA – режиме (при котором для каждого пикселя хранятся значения R, G, B и, возможно A), так и в режиме цветовых индексов (в этом случае для каждого пикселя хранится всего одно число, называемое цветовым индексом или индексом в палитре). Каждый цветовой индекс идентифицирует одно вхождение в таблицу, содержащую в каждом элементе набор из одной R, одной G и одной B – величины. Такая таблица называется

цветовой таблицей (или цветовой картой, или просто палитрой).

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

Между разными аппаратными графическими платформами существует множество различий, касающихся как размера пиксельного массива, так и количества цветов, которые могут быть отображены в каждом пикселе. В любой графической системе каждый пиксель имеет одинаковое количество памяти для хранения своего цвета, а вся эта память для всех пикселей вместе называется цветовым буфером. Размер буфера обычно измеряется в битах, таким образом, 8-битовый буфер может содержать 8 бит данных (то есть одну из 256 возможных комбинаций, задающих конкретный цвет) для каждого пикселя. Размер возможных буферов меняется от компьютера к компьютеру.

Каждое из R, G и B – значений может изменяться от 0.0 (отсутствие интенсивности) до 1.0 (полная интенсивность). Например, комбинация R=0.0, G=0.0 и B=1.0 задает максимально возможный по яркости синий цвет. Если R, G и B равны 0.0, цвет пикселя

черный; если все компоненты равны 1.0, пиксель будет нарисован самым ярким белым цветом, который возможно отобразить на экране. Смешивание синего и зеленого цветов дает оттенки голубого. Комбинация синего и красного цветов дает лиловый. Красный и зеленый образуют желтый. Чтобы облегчить себе задачу по созданию желаемых цветов из R, G и B – компонент, взгляните на рисунок 4.1. Оси куба на рисунке представляют интенсивности красного, зеленого и синего.

Рисунок 4-1. Цветовой куб

Команды, используемые для указания цвета объекта (в данном случае точки), могут быть достаточно просты:

glColor3f(1.0,0.0,0.0); //Текущий цвет – красный, без зеленого и без синего glBegin(GL_POINTS);

glVertex3fv(point_array); glEnd();

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

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

Далее, примитивы растеризуются (или преобразуются в двумерное изображение). Растеризация требует определения того, какие квадраты целочисленной решетки оконных координат заняты примитивом. Этим квадратам присваивается определенный цвет и другие величины. Квадрат решетки вместе с присвоенным ему значением цвета, z (глубиной) и координатами текстуры называется фрагментом. Пиксели являются элементами буфера кадра; фрагмент поступает из примитива и комбинируется с соответствующим ему пикселем для получения нового пикселя. После того, как фрагменты примитива построены, к ним применяются (если включены) текстурирование, туман и антиалиасинг. Затем над фрагментами и пикселями, уже находящимися в буфере кадра, выполняются альфа наложение, микширование (ditheringтехника симуляции недостающих цветов) и побитовые логические операции (если какие-либо или все эти механизмы включены). Наконец, цветовая величина

фрагмента (и в индексном, и в RGBA - режиме) записывается в пиксель и отображается в окне с использованием цветового режима окна.

4.3 RGBA – режим против Индексного режима

В обоих режимах (индексном и RGBA) в каждом пикселе хранится определенное количество информации о цвете. Это количество определяется числом битовых плоскостей в буфере кадра. Битовая плоскость содержит 1 бит данных для каждого пикселя. Если присутствует 8 битовых плоскостей, в них суммарно хранится 8 бит на

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

Битовые плоскости часто поровну разделяют на хранилища R, G и B компонент (то есть, система с 24 битовыми плоскостями содержит по 8 бит для красного, зеленого и синего), но это не всегда соответствует действительности. Для выяснения числа битовых плоскостей, присутствующих в вашей системе для величин красного, зеленого, синего цвета, альфа величин и величин цветовых индексов вызовите glGetIntegerv() c аргументами GL_RED_BITS, GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS и GL_INDEX_BITS соответственно.

Замечание: Цветовые интенсивности на большинстве компьютерных экранов не воспринимаются человеческим глазом, как непрерывные. Предположим, что цвета состоят только из красного компонента с зеленым и синим, установленными в нуль. С увеличением интенсивности от 0.0 (полное отсутствие интенсивности) до 1.0 (полная интенсивность) увеличивается число электронов, ударяющихся в пиксель экрана. Однако возникает вопрос: будет ли цвет с интенсивностью 0.5 находится (по внешнему виду) ровно посередине между 0.0 и 1.0? Чтобы выяснить это, напишите программу, заполняющую прямоугольную область в шахматном порядке пикселями с интенсивностями красного равной 0.0 и 1.0, а рядом – прямоугольный регион, целиком заполненный пикселями с интенсивностью красного равной 0.5. На некоторой разумной дистанции от экрана должно казаться, что оба региона имеют одинаковую интенсивность. Если они выглядят сильно различающимися, вам следует использовать любой механизм коррекции, имеющийся в вашей конкретной системе. Например, во многих системах присутствует таблица настройки интенсивностей, позволяющая настроить внешний вид 0.5, таким образом, чтобы оно действительно выглядело серединой между 0.0 и 1.0. Обычно применяемый для этого механизм коррекции имеет экспоненциальный характер, а на экспоненту ссылаются как на гамму (отсюда термин гамма-коррекция). Использование одинаковой гаммы для красного, зеленого и синего компонент дает обычно неплохой результат, но три разные гаммы могут дать лучший.

4.3.1 RGBA – режим

В RGBA – режиме аппаратура выделяет некоторое число битовых плоскостей для каждого из R, G, B и A компонента (это число не обязательно является одинаковым для каждого компонента), как показано на рисунке 4-2. R, G и B – величины чаще хранятся в виде целых чисел, чем в виде чисел с плавающей точкой и, следовательно, масштабируются согласно выделенному количеству битовых плоскостей. Например, если в системе имеется 8 бит для красного компонента, в них могут быть сохранены целые от 0 до 255. Таким образом, 0, 1, 2, ..., 255 в битовых плоскостях будут соответствовать R – величинам 0/255=0.0, 1/255, 2/255, ..., 255/255=1.0. Независимо от числа битовых плоскостей 0.0 задает минимальную интенсивность, а 1.0 – максимальную.

Рисунок 4-2. RGB – величины из битовых плоскостей

Замечание: Значение альфа (A в RGBA) не имеет прямого действия на цвет, отображаемый на экране. Оно может быть использовано для множества вещей, включая цветовое наложение и прозрачность, а также для воздействия на записываемые в буфер величины R, G и B.

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

может превышать , где n количество битовых плоскостей. Таким образом, система с 24-мя битовыми плоскостями может одновременно отображать до 16.77 миллионов различных цветов.

4.3.1.1Цветовое микширование

Дополнительно: Некоторые аппаратные средства используют микширование для увеличения числа видимых цветов. Микширование это техника, заключающаяся в использовании комбинации нескольких цветов для создания видимости других цветов. Для иллюстрации того, как работает микширование, представим, что в вашей системе имеется всего по 1 биту для R, G и B, и она, таким образом, может отображать только 8 цветов: черный, белый, красный, синий, зеленый, желтый, голубой и фиолетовый. Чтобы отобразить область, закрашенную розовым цветом, аппаратура может заполнить ее красными и белыми пикселями по принципу шахматной доски (пиксели через один по вертикали и горизонтали имеют один и тот же цвет, а соседние пиксели разные цвета). Если ваш глаз находится на достаточном расстоянии от экрана, на котором он не может различить отдельные пиксели область будет казаться розовой, то есть средним цветом между белым и красным. Для увеличения «красноты» розового цвета можно изменить соотношение между цветами, увеличив количество красных пикселей и уменьшив количество белых. Для более «бледного» розового следует поступить наоборот увеличить число белых пикселей и уменьшить количество красных.

При использовании этой техники на экране нет розовых пикселей вообще. Единственный способ увидеть розовый цвет покрыть область, состоящую из

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

Рисунок 4-3 иллюстрирует несколько примеров микширования черного и белого цветов для получения трех оттенков серого. Слева направо в верхнем ряду фрагменты размером 4x4 пикселя представляют шаблоны микширования для 50 процентного, 19 процентного и 69 процентного серого цвета. Под каждым шаблоном вы можете видеть его уменьшенную и многократно повторенную копию, однако черные и белые квадраты на них все же больше, чем большинство пикселей. Если вы посмотрите на эти шаблоны с достаточно большого расстояния, вы обратите внимание, что отдельные квадратики на них сливаются и, таким образом, образуют три оттенка серого цвета.

Рисунок 4-3. Микширование черного и белого для создания видимости серого

При наличии 8 бит на каждый из R, G и B компонентов вы можете получить достаточно высококачественное изображение и без микширования. Однако то, что на вашей машине имеется 24 битовых плоскости, еще не говорит о том, что микширование вам совсем не нужно. Например, если вы работаете в режиме двойной буферизации, битовые плоскости могут быть разделены на 2 набора по 12 плоскостей каждый, то есть на самом деле имеется только 4 бита для каждого из R, G и B компонент. Без микширования цвет с 4-мя битами на компонент во многих ситуация может давать менее удовлетворительные результаты.

Вы включаете и выключаете микширование, передавая аргумент GL_DITHER командам glEnable() и glDisable(). Имейте в виду, что микширование, в отличие от большинства возможностей OpenGL, по умолчанию включено.

4.3.2 Индексный режим

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

Рисунок 4-4. Цветовая таблица

Художник при рисовании ограниченным количеством цветов выбирает один из них на палитре и заполняет им область на картине. Компьютер сохраняет в битовых плоскостях цветовой индекс для каждого пикселя. Затем величины в битовых плоскостях разрешаются: каждый пиксель рисуется комбинацией красного, зеленого и синего цветов, извлеченной из ячейки цветовой таблицы, соответствующей хранимому индексу (рисунок 4-5).

Рисунок 4-5. Рисование картинки с использованием цветовой таблицы

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

Размер цветовой таблицы всегда является степенью двойки и обычно варьируется от

до , где показатель представляет собой количество используемых

битовых плоскостей. Если количество индексов в цветовой таблице, а m число доступных битовых плоскостей, то количество возможных к использованию элементов

или вхождений в таблицу равно меньшему из и .

В RGBA– режиме цвет каждого пикселя не зависит от других пикселей. Однако в индексном режиме все пиксели с одинаковым индексом (хранящимся в битовых плоскостях) разделяют один и тот же элемент в цветовой таблице. Если изменяется

Соседние файлы в предмете Компьютерная Графика