}
// обработка ввода void input ()
{
switch(in.vkey)
{
case VK_ADD: // следующий режим
mode++; mode%=10; break;
case VK_SUBTRACT: // предыдущий режим mode--; mode=(mode<0)?9:mode; break;
case VK_F1: // изменяем способ отображения type=!type; break;
default:;
}
in.vkey=-l;
}
void example_deinit()
{
gl.deinit() ;
}
void draw() // вывод сцены
{
input();
// очищение буфера цвета glClear(GL_COLOR_BUFFER_BIT);
if(type) // отображение с использованием массивов {
// сохраняем атрибуты массивов
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS) ;
// инициализируем массив вершин glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_FLOAT,sizeof(float)*2, points) // инициализация массива цветов glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,sizeof(float)*3,color) gIDrawArrays(begin_mode[mode],0,8); // вывод glPopClientAttrib(); // восстановление атрибутов }
else // отображение с использование glBegin
{
glBegin(begin_mode[mode]); for(int i=0;i<8;i++)
{
glColor3fv(color[i]); // текущий цвет
glVertex2fv(points[i]); // вывод вершины
}
glEnd();
}
}
Атрибуты примитивов
В предыдущем примере мы познакомились с примитивами низшего уровня: точки, линии и многоугольники, включая треугольники и четырехугольники. Помимо атрибутов, наследуемых от вершин, из которых они состоят, примитивы обладают дополнительными свойствами, приведенным;- ниже.
Точки - размер и сглаживание.
Линии - ширина, сглаживание, образец трафарета, задающий пункгирность линии.
Многоугольники - сглаживание, способ закраски, образец трафарета, задающий штриховку. На маломощных системах штриховку можно использовать для имитации прозрачности многоугольника. Например, для многоугольника прозрачного на 20% нужно подготовить образец с 20% битов, установленных в 0. Многоугольник характеризуется двумя гранями: лицевой и задней. По умолчанию грань, вершины которой следуют против часовой стрелки, когда на нее смотришь, является лицевой.
Демонстрация атрибутов точек, линий и полигонов. Клавиши <2, А изменяют размер точек.
Клавиши изменяют ширину линий.
Клавиша F1 изменяет режим сглаживания точек, линий и полигонов. Результат сглаживания может изменяться от используемой видеокарты.
*/
float points[8][2]= // массив точек {{-50,50},{0,70},{40,40},{30,0},
{50,-50}, {0,-70}, {-40,-40}, {-30.-0} };
// массив режимов построения
int begin_mode[3] = {GL_POINTS,GL_LINES,GL_POLYGON} ;
int mode=0; // текущий режим
int smooth=0; // сглаживание точек и линий
// размер точек, ширина линий
float pointsize,linewidth;
// образец штриховки char
pattern[128]={128,0,0,1,64,0,0,2,32,0,0,4,16,0,0,8} void example_init ()
{
gl.set(l); // настройка OpenGL // цвет очищения буфера цвета glClearColor(1, 1,1, 1);
glColor3f(0,0,1); // текущий цвет вершины // устанавливаем образец штриховки полигонов glEnable(GL_POLYGON_STIPPLE) ; copy(pattern,pattern+1б, pattern + 1б) ; reverse(pattern+16,pattern+32) ; copy(pattern,pattern+32*3, pattern+32); glPolygonStipple(pattern) ;