Введение в Opengl 1 1 Что такое OpenGL? 1 2 Немного Opengl кода 2 3 Синтаксис команд Opengl 4



бет2/6
Дата29.05.2016
өлшемі222 Kb.
#100722
түріГлава
1   2   3   4   5   6

1.3 Синтаксис команд OpenGL


Как можно было заметить из простой программы, приведенной в предыдущем разделе, в названии команд 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(). Для временного изменения переменных состояния и восстановления их исходных значений следует пользоваться именно этими командами, так как они реализованы более эффективно по сравнению с отдельными командами запросов.




Достарыңызбен бөлісу:
1   2   3   4   5   6




©dereksiz.org 2022
әкімшілігінің қараңыз

    Басты бет