п - количество элементов, которые планируется отобразить;
format - описывает формат данных в индексном массиве;
pointer - указатель на первый используемый индекс.
При формировании изображения куба в функции отображения display () нужно шесть раз вызвать функцию glDrawelements ( ), по одному разу на каждую грань:
for(i=0;i<6;i++)
glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE, &cubelndex[4*i]);
Таким образом, после формирования и инициализации массивов в процессе отображения придется выполнить только шесть вызовов функций OpenGL вместо пятидесяти с лишним. Поворачивать изображение куба можно тем же способом, что и раньше, поскольку функция glDrawElements( ) использует при формировании изображения параметры текущего состояния, в том числе и матрицу вида.
Можно еще больше упростить процесс отображения, если учесть, что каждая грань куба является именно четырехугольником, а не многоугольником общего вида. Тогда можно использовать в функции glDrawelements( )тип GL_QUADS вместо GL_P0LYG0N и вызывать эту функцию в display ( ) только один раз вместо шести вызовов при вычерчивании многоугольников общего вида:
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubelndices);
Если в glDrawelements ( ) используется тип GL_QUADS, то вычерчивание следующего четырехугольника начинается автоматически после завершения обработки каждой очередной четверки вершин.
4.5. Аффинные преоброзовония Под преобразованием (трансформацией - transformation) в дальнейшем будем понимать функцию, которая принимает (точку или вектор) и отображает ее на другую точку (или вектор). Графически смысл преобразования представлен на рис. 4.28. Для точек преобразование формально записывается в виде
Q=T(P),
а для векторов - в виде
v = /?(м).
При использовании однородных координат и векторы, и точки представляются в виде четырехмерных матриц-столбцов. В таком случае преобразование имеет единообразный вид и для точек, и для векторов одного и того же фрейма:
q=Ap),
v=/u).
Эта формулировка носит слишком общий характер, чтобы ее можно было использовать на практике, поскольку она распространяется на любые однозначные отображения точек и векторов. На практике, даже располагая удобным описанием функции нужно применять преобразование ко всем точкам кривой. Если, например, трансформируется отрезок прямой, обобщенное преобразование придется применить к каждой точке между двумя заданными конечными.