GameDev :: OpenGL @ Урок 5

Используются технологии uCoz
Урок 5. Начинаем рисовать:

Чем мы будет на сей раз заниматься? Наверное, пора уже приступать к рисованию. Но с чего начать? Как ни странно, начнем с самого начала :)
В этом уроке мы научимся рисовать точки, линии, квадраты, треугольники, четырехугольники, и полигоны. Все это рисуется почти по одной же схеме. Для того чтобы научиться все это рисовать, мы должны разобраться с таким понятием, как примитив.
Что такое этот примитив? Однозначно сказать не можно. Одни считают, что примитив- это набор фигур, состоящих из прямой, многоугольника, и некоторой формы текста. Другие считают что в понятие примитив входят такие фигуры, как: окружности, различные кривые, поверхности, сплошные тела.

Примитив задается набором вершин. Вершина (Vertex)- это просто-напросто координата точки на экране. Например, треугольник можно нарисовать с помощью 3-х вершин (в двухмерной системе координат), для рисования линии нам хватит и двух, и т.д.
Синтаксис задания вершин таков:

glBegin(тип);
glVertex*(…);

glVertex*(…);
glEnd();

Где, * может быть [2,3][i,d,f,b], в зависимости от количества точек, и от типа чисел, которые мы будет использовать при задании точки. Например, если мы будем рисовать в двухмерном пространстве, и при этом использовать тип double, тогда функция будет иметь вид: glVertex2d(x,y);. Я думаю с этим все ясно. Если вы уже забыли синтаксис функций, то обратитесь к 4 уроку.

А теперь займемся самим рисованием. Первое, что мы будем рисовать- это точки. Но, перед этим давайте настроим наше приложение. Вот код, который мы написали в 2 уроке:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void Display(void)
{
}

void main(int argc,char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
   glutInitWindowSize(400,500);
   glutInitWindowPosition(0,0);
   glutCreateWindow("OpenGL Lesson2");
   glutDisplayFunc(Display);
   glutMainLoop();
}

Как вы помните, у нас создалось некрасивое, прозрачное окно. Давайте теперь зададим цвет окна. Для этого в функцию main() допишем одну строку:
glClearColor(r,g,b,t); Где, r-красный цвет, g-зеленый, b- голубой, t-прозрачность. Значение цветов выставлять нужно в диапазоне от 0 до 1 (т.е. 0.01, 0.2, 0.5, 0.83 и т.д.). Итак, выставьте нужный вам цвет, например поставим цвет фона белый. glClearColor(1,1,1,1);
И теперь нужно в функцию Display(void) добавить еще одну строку:
glClear(GL_COLOR_BUFFER_BIT);
Этой командой мы закрашиваем цвет фона в тот цвет, который указали в ф-и main();
Теперь давайте посмотрим на полный листинг нашей программы:

#include <GL/gl.h>
#include <GL/glut.h>

void Display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
}

void main(int argc,char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
   glutInitWindowSize(400,500);
   glutInitWindowPosition(0,0);
   glutCreateWindow("OpenGL Lesson2");
   glClearColor(1,1,1,1);
   glutDisplayFunc(Display);
   glutMainLoop();
}

Запустите это приложение теперь. И что мы видим? Правильно, красивое белое окно! :)
Теперь что ни будь нарисуем. Итак, для рисования фигуры нам одной вершины не достаточно. Для это нам нужно объединить несколько вершин. Такое объединение вершин в одно целое называется примитив. Задание примитива происходит внутри командных скобок:

void glBegin (GLenum mode); void glEnd (void);

Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:
GL_POINTS   каждая вершина задает координаты некоторой точки.
GL_LINES   каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется.
GL_LINE_STRIP   каждая следующая вершина задает отрезок вместе с предыдущей.
GL_LINE_LOOP   отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную.
GL_TRIANGLES   каждая отдельная тройка вершин определяет треугольник; если задано не кратное трем число вершин, то последние вершины игнорируются.
GL_TRIANGLE_STRIP   каждая следующая вершина задает треугольник вместе с двумя предыдущими.
GL_TRIANGLE_FAN   треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются).
GL_QUADS   каждая отдельная четверка вершин определяет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются.
GL_QUAD_STRIP   четырехугольник с номером n определяется вершинами с номерами 2n-1, 2n, 2n+2, 2n+1.
GL_POLYGON   последовательно задаются вершины выпуклого многоугольника.

Теперь давайте разберем все это на одном примере. В следующем примере нарисуем одну линию.

#include <GL/glut.h>
#include <GL/gl.h>

void Display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
   glColor3d(0,0,0);
   glVertex2d(-1,0);
   glVertex2d(1,1);
   glEnd();
   glFlush();
}

void main(int argc,char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
   glutInitWindowSize(400,500);
   glutInitWindowPosition(0,0);
   glutCreateWindow("OpenGL Lesson2");
   glClearColor(1,1,1,1);
   glutDisplayFunc(Display);
   glutMainLoop();
}

В этом примере есть две новые, нам не известные, функции, но об этом мы поговорим в следующий раз!

До встречи в следующем уроке!
Alex Salo

Навигация
Назад | Список уроков | Вперед
Используются технологии uCoz