Как можно было заметить из простой программы, приведенной в предыдущем разделе, в названии команд OpenGL используется префикс gl и заглавные буквы для отделения слов, составляющих название команды (вспомним, например, glClearColor()). Подобным же образом OpenGL определяет константы, начинающиеся с GL_ со всеми заглавными буквами и символом подчеркивания для отделения слов (например, GL_COLOR_BUFFER_BIT).
Кроме того, можно было обратить внимание на казалось бы лишние буквы и цифры в названии некоторых команд (например, 3f в glColor3f() и glVertex3f()). Действительно, слова Color (цвет) в названии glColor3f() достаточно, чтобы определить команду меняющую текущий цвет. Однако в библиотеке определено несколько версий такой команды, принимающих данные в различных форматах. Более конкретно, 3 в названии команды glColor3f() означает, что она получает три аргумента, существует и другая версия, получающая четыре аргумента. Буква f означает, что аргументы имеют формат числа с плавающей точкой. Подобное соглашение об именовании команд позволяет программисту использовать желаемый, более удобный для него формат аргументов.
Некоторые команды воспринимают до восьми различных типов данных. Буквы, используемые в качестве суффиксов для указания конкретного типа данных в реализации OpenGL для ISO - стандарта языка C приведены в таблице 1-1. Отдельные реализации OpenGL (например, для языка C++ или Ada) могут не следовать описанной схеме точно.
Таблица 1-1. Суффиксы команд и соответствующие им типы аргументов
Суффиксы
|
Тип данных
|
Типично соответствующий тип языка С
|
Тип, определенный в OpenGL
|
b
|
целое 8 бит
|
signed char
|
GLbyte
|
s
|
целое 16 бит
|
short
|
GLshort
|
i
|
целое 32 бита
|
int или long
|
GLint, GLsizei
|
f
|
число с плавающей точкой 32 бита
|
float
|
GLfloat, GLclampf
|
d
|
число с плавающей точкой 64 бита
|
double
|
GLdouble, GLclampd
|
ud
|
беззнаковое целое 8 бит
|
unsigned char
|
GLubyte, GLboolean
|
us
|
беззнаковое целое 16 бит
|
unsigned short
|
GLushort
|
ui
|
беззнаковое целое 32 бита
|
unsigned int или unsigned long
|
GLuint, GLenum, GLbitfield
|
Таким образом, следующие две команды
glVertex2i(1,3);
glVertex2f(1.0,3.0);
|
эквивалентны за тем исключением, что первая принимает координаты вершины в виде 32-разрядного целого, а вторая – в виде числа с плавающей точкой одинарной точности.
Замечание: Производители реализаций OpenGL имеют право выбирать, какие типы данных языка C использовать, для представления типов OpenGL. Если в тексте программы использовать типы, определенные OpenGL, вместо явного указания типов языка C, можно избежать проблем при переносе приложения на другую реализацию OpenGL.
|
Некоторые команды последней буквой в своем имени могут иметь v, это означает, что команда принимает указатель на вектор (или массив) величин, а не несколько отдельных аргументов. Многие команды имеют и векторную, и не векторную версии, но среди тех, которые не попадают в это число, одни работают только с индивидуальными аргументами, в то время как другие в обязательном порядке требуют указатель на вектор величин в качестве части или всех своих аргументов. Следующий фрагмент показывает пример использования векторной и не векторной версии команды установки текущего цвета.
glColor3f(1.0,0.0,0.0);
GLfloat color_array[]={1.0,0.0,0.0};
glColor3fv(color_array);
|
Кроме всего прочего, OpenGL определяет тип GLvoid, который чаще всего применяется в векторных версиях команд.
Далее в этом пособии будем мы ссылаться на команды по их базовому имени и звездочке в конце (например, glColor*()), что означает, что приводимая информация относится ко всем версиям определенной команды. Если информация специфична только для подмножества версий одной команды, это будет отмечено при помощи добавления к вышеописанной записи части суффикса (например, glVertex*v() означает все векторные версии команды установки вершины).
1.4 OpenGL как машина состояния (state machine)
OpenGL – это машина состояния. Вы задаете различные переменные состояния, и они остаются в действии, сохраняя свое состояние, до тех пор, пока вы же их не измените. Как вы уже видели, текущий цвет – это переменная состояния. Вы можете установить цвет в красный, синий, белый и так далее, и после этого все объекты будут рисоваться этим цветом до тех пор, пока вы его не измените на что–либо другое. Текущий цвет – это только одна из многих переменных состояния, имеющихся в OpenGL. Другие управляют такими аспектами, как текущая видовая и проекционная трансформации, шаблоны для линий и полигонов, режимы отображения полигонов, соглашения об упаковке пикселей, позиции и характеристики источников света, параметры материалов для объектов и многое другое. Многие переменные относятся к возможностям OpenGL, которые можно включать или выключать командами glEnable() или glDisable().
Каждая переменная состояния имеет свое значение по умолчанию, и в любой момент вы можете опросить систему на предмет ее текущего значения. Обычно, чтобы это сделать, используется одна из следующих 6 команд: glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetIntegerv(), glGetPointerv(), glIsEnabled(). Выбор конкретной команды зависит от того, в каком формате вы ожидаете ответ на запрос. Для некоторых переменных состояния имеются более специфические команды опроса (такие как, glGetLight*(), glGetError() или glGetPolygonStipple()). Кроме того, вы можете сохранять наборы значений переменных состояния в стеке атрибутов командами glPushAttrib() или glPushClientAttrib(), временно изменять их значения и позже восстанавливать из стека командами glPopAttrib() или glPopClientAttrib(). Для временного изменения переменных состояния и восстановления их исходных значений следует пользоваться именно этими командами, так как они реализованы более эффективно по сравнению с отдельными командами запросов.
Достарыңызбен бөлісу: |