Книги

OpenGL / FPC - Глава 3

Итак, у нас есть окно OpenGL. Все, что нам следует сделать — отобразить в нем что-нибудь. Но до веселья еще далеко. Сначала следует инициализировать OpenGL.

"А зачем инициализировать еще раз?" —, наверно, спросите вы. На самом деле все, что мы делали ранее, состояло в создании контекста OpenGL со стороны Windows API. Теперь же нам надо произвести инициализацию таких параметров OpenGL, как "каков размер нашей матрицы" или "какой системой координат мы пользуемся". Вот так.

Первое, что следует установить в OpenGL, — это основная область рисования (basic drawing canvas). Затем можно активировать или дезактивировать свойства (типа освещения, цветового сопряжения и тд), а затем уже можно выводить что-нибудь на экран. Итак, идет инициализация.

procedure OpenGL_Init;
begin

  glClearColor( 0.0, 0.0, 0.0, 0.0 );
  glViewport( 0, 0, width, height );
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();
  glOrtho( -2, 2, -2*height/width, 2*height/width, -2, 2);
  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity();

end;

Первая строка нам знакома. Следующая — glViewport(). Она определяет размер нашей области рисования. Рассматривайте эту область как видимую часть нашего окна. Первыми двумя параметрами обычно задают 0,0 — левый верхний угол окна. Максимально возможные значения устанавливаются в width и height, представляющие собой ширину и высоту нашего окна. Таким образом, мы задали всю область окна как видимую поверхность.

Другой способ состоит в установке Viewport только для части окна, чтобы затем рисовать функциями Windows API в других частях (или что-нибудь еще).

glMatrixMode() определяет, какой тип матричных операций мы собираемся выполнять. Это требует более пристального изучения.

Существует 3 вида матричных операций. Первый — это GL_MODELVIEW. Он используется для управления видом матрицы. Второй — GL_PROJECTION. Он используется для управления проекцией матрицы. Третий пока не важен ;)

Не углубляясь в теорию, более важным является то, что мы можем с этим хозяйством сделать. Первый — отмена всяческих манипуляций: glLoadIdentity();. Это — сброс нашей матрциы.

Приступим к заданию проекции. Существует два вида проекций в OpenGL: ортогональная и перспективная проекции. Перспективная проекция — та, что мы пользуемся в жизни: предметы кажутся тем меньше, чем дальше они от вас, и тому подобное. А вот ортогональная проекция — другая. Предметы не меняют размера при удалении. Это — 2D взгляд на 3D мир. Закройте один глаз, и вы увидите, что я имею в виду (в действительности же — нет, поскольку мозг компенсирует картинку).

В любом случае, начнем с ортогональной проекции. Определим glOrtho( -2, 2, -2*height/width, 2*height/width, -2, 2);. Первые два аргумента — min и max по оси X. Третий и четвертый — min и max по оси Y, а последние аргументы — min и max по оси Z. Все, что бы мы нарисуем внутри этой 3D области, попадет на экран. Все, что попадает за пределы этой области, будет отсекаться.

"Зачем делить-то?"— можете спросить вы. Обычно окна с рисунками OpenGL не квадратные. То есть ширина окна, как правило, больше его высоты. Если мы определим параметры по всем осям от -2 до 2, то будет казаться, что прямоугольник растянут по горизонтали. Так что в нашем определении приходится учитывать отношение ширины окна к высоте. Надо рассчитать частное ширина/высота. Затем умножить его на длину. Обычно это отношение составляет 4:3 или около 1.3

На данный момент это все. У нас будет время поиграться с многими другими инициализациями позже. Теперь, давайте создадим небольшую процедуру под названием OpenGL_Draw.

procedure OpenGL_Draw;
begin

  glClear( GL_COLOR_BUFFER_BIT );
  glColor3f( 1.0, 0.0, 0.0 );
  glBegin(GL_TRIANGLES);
    glVertex3f(0.0, 1.0, 0.0);
    glVertex3f(-1.0, -1.0, 0.0);
    glVertex3f(1.0, -1.0, 0.0);
  glEnd();  

end;

Первым делом мы очищаем экран. Для этого используется glClear(). В качестве параметра мы информируем OpenGL, что конкретно мы хотим очистить. На данный момент лишь наши буферы должны быть очищены и заполнены нашим цветом фона.

С помощью glColor3f(); мы задаем цвет наших объектов OpenGL. Этот цвет будет активным, пока мы не зададим другой.

Готовьтесь к более аппетитным штучкам. Используя, glBegin(); мы начинаем рисовать OpenGL объекты. На данный момент нам хочется нарисовать треугольники, так что мы передаем параметр GL_TRIANGLES. Поскольку треугольник имеет три стороны, для его определения нам надо задать 3 вершины.

Вершина задается с помощью glVertex3f();. 3f означает "3 float", то есть нам для значений X/Y/Z нужны 3 параметра, описываемые числами с плавающей точкой.

Обратите внимание, КАК мы задаем вершины при определении треугольника.

Когда мы создаем треугольник, перед всегда рисуется против часовой стрелки. Обратная сторона треугольника рисуется по часовой стрелке.

Вот такая процедура, осуществляющая рисование.

Пока с этим все. Простой и весьма красный треугольник. Скачайте полный текст отсюда. Скомпилируйте, поэкспериментируйте, добавьте больше треугольников, и тп. Когда закончите, можете переходить к следующей главе.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links