Таблица 2.1. Суффиксы команд и типы данных аргументов
Суффикс |
Тип данных |
Обычный тип С или C++ |
Название типа в OpenGL |
b |
8-битное целое (символ со знаком) |
signed char | Glbyte |
s |
16-битное целое (короткое целое) |
short | Glshort |
I |
32-битное целое (длинное целое) |
int или long |
GLint, GLsizei |
f |
32-битное вещественное (с плавающей точкой) |
float | GLfloat, GLcIampf |
d |
64-битное вещественное (двойной точности) |
double | GLdouble, GLcIampd |
ub |
8-битное число без знака (символ без знака) |
unsigned char | DLubyte, GLboolean |
us |
16-битное число без знака (короткое целое без знака) |
unsigned short | GLushort |
ui |
32-битное число без знака (целое без знака или длинное целое без знака) |
unsigned int или unsigned long |
GLuint, GLenum, GLbitfield |
Пусть, к примеру, функция с суффиксом i «ожидает» 32-битное целое, а ваша система может передать int как 16-битное целое. Тогда если бы вы захотели инкапсулировать команды OpenGL для рисования точки в базовую функцию вроде drawDotO, то было бы соблазнительно использовать такой код:
void drawDotdnt х. int у)
<- danger: passes ints
<- опасность: передает целые (int)
{
// draw dot at integer point(x.y)
// рисуем точку с целыми координатами (х.у)
glBegin(GL_POINTS): glVertex2i(x.y):
gl EndO :
}
Этот код передает ints в функцию glVertex2i(). Это сработает в системах, использующих 32-битный тип ints, однако в тех системах, где ints - 16-битный, могут возникнуть проблемы. Надежнее писать
Начальная стадия: рисование фигур
функцию drawingDotO1 так, как приведено в листинге 2.3, а также использовать в своих программах тип GLints. Когда вы перекомпилируете свои программы в новой системе, типы GLint, GLfloat и т. д. будут связываться с соответствующими типами С++ (в заголовочном файле GL.h OpenGL - см. приложение А) для этой системы, и эти типы будут использоваться постоянно во всей программе.
Листинг 2.3. Подробности инкапсуляции OpenGL в базовой функции drawDotO void drawDotCGLint х. GLint у): {
// draw dot at integer point (x. y)
// рисуем точку с целыми координатами (х. у)
glBegin(GL_POINTS); g1Vertext2i(x, у):