Для использования команд-расширений программу пришлось дополнить строками с описанием прототипов процедур:
procedure glVertexPointer (size: GLint; atype: GLenum;
stride: GLsizel; data: pointer);
stdcall;
external OpenGL32;
Procedure glColorPointer (size: GLint; atype: GLenum; stride: GLsizel;
data: pointer);
stdcall;
external OpenGL32;
procedure glDrawArrays (mode: GLenum; first: GLint; count: GLsizel);
stdcall;
external OpenGL32;
Procedure glEnableClientState (aarray: GLenum);
stdcall;
external OpenGL32;
Procedure glDisableClientState (aarray: GLenum);
stdcall;
external CpenGL32;
OpenGL32- константа, определяемая в модуле opengl. pas. Потребовалось также задать значение констант, используемых этими процедурами:
const
GL_VERTEX_ARRAY = $8074;
GL__COLOR_ARRAY = $8076;
Значения констант и информацию о типах аргументов процедур я почерпнул из заголовочных файлов сторонних разработчиков и перепроверил по содержимому файла gl. h, поставляемым с Visual C++. Информация о команде glEnableclientstate взята из описания OpenGL фирмы SGI.
Первым аргументом glDrawArrays может быть любая константа, которую допускается использовать в glBegin. Чтобы лучше разобраться с принципом построения, рекомендую посмотреть результат работы программы с использованием отличных от GL_POLYGON констант.
В примере по массиву вершин строится множество полигонов вызовом команды
glDrawArrays(GL POLYGON, 0, 4); // рисование множества полигонов
Эта команда является сокращением следующей последовательности команд (пример из подкаталога Ex39):
glBegin (GL_POLYGON);
glArrayElement(0);
glArrayElement(1);
glArrayElement(2);
glArrayElement(3);
glEnd;
Используемая здесь функция glArrayElement (также расширение стандарта) берет в качестве вершины примитива элемент массива с заданным индексом. Индекс, как видно из примера, начинается с нуля.
В продолжение этой темы разберите также проект из подкаталога Ex40 - мою адаптацию и трансляцию под Delphi программы Polygons из книги [1], результат работы которой иллюстрирует Рисунок 2. 13.