Elite Games - Свобода среди звезд!

Уроки для программистов - OpenGL

Глава 2. OpenGL

Для работы с памятью:

— AcedUtils – альтернативные модули для Делфи(не обязательно)

Для работы с OpenGL лучше использовать что-то вроде оболочки.
Для Delphi я предлагаю использовать DOT (Delphi OpenGL Toolkit):

— документация www.delphi3d.net/dot
— сам DOT www.delphi3d.net/download/dot.zip

В DOT входит:

— заголовочные файлы для работы с OpenGL(вплоть до версии 2.0).
— математическая библиотека.
— юниты для работы с шейдерами (включая GLSL).
— юниты для работы с окнами и внеэкранными буферами.
— юниты для загрузки 3d моделей из распространённых форматов.
— юниты с различными утилитами (запись в AVI, NV parse и др.).
— и самое интересное — framework — каркас нашего будущего движка.
 

Открываем framework2, компилируем, видим треугольник, вокруг
которого можно полетать, мышкой смотреть по сторонам.. Уже
что-то..

Давайте разбираться в коде..

По созданию формы делается следующее:
ConfigureDisplay — процедурка, в которой происходит инициализация OpenGL и
там можно поменять расширение экрана и тому подобное.
LoadExtensions — процедура, в которой будут загружаться расширения OpenGL.
CreateScene — процедура, в которой будут загружаться сцена.
CreateTextures — процедура, в которой будут загружаться текстуры.
CreateShaders — а здесь шейдеры.

По закрытию, просто восстанавливается состояние экрана до запуска.

AppEventsIdle — еще можно через таймер, ну разницы особо никакой. Здесь в данный момент считается FPS (кадры в секунду), проверяется клавиатура и двигается камера. В будущем будет производиться Update сцены (ну там, просчет систем частиц, движений объектов, и т.д.)

Сейчас я объясню термины...

Расширения OpenGL.
Понимаете, сам по себе OpenGL не поддерживает шейдеры, мультитекстурирование и другие полезности. Например, DirectX – там с новой версией добавляются новые возможности. Все. В OpenGL они добавляются путем механизма расширений. Ну, допустим, чтобы использовать шейдеры, нужно загрузить специальное расширение. Подробнее об этом я расскажу позже, но можно посмотреть на http://www.gamedev.ru/articles/?sect=2

Сцена.
Это иерархия объектов... Да что я вам объясняю, вы и сами знаете.

Шейдеры.
Если на пальцах, то это ассемблер для видеокарт. Довольно трудно для понимания по началу, но потом оказывается, что это очень даже просто. Поговорим позже об этом. Чтоб понять, нужно знать, как видеокарта рисует объекты..

А теперь команды OpenGL.

- glEnable – команда включающая что-то. Это может быть включение освещения или шейдеров или текстур, короче всего.
- glDisable – собственно glEnable, но выключение.

В примере есть строка glEnable(GL_DEPTH_TEST) – включение какого-то GL_DEPTH_TEST.
GL_DEPTH_TEST — проверка глубины... если она будет выключена объекты не будут закрывать друг друга. Активно используется выключение этого теста, при рисовании планет (если планеты статические и играют роль фона, до которого нельзя долететь) или SkyBox`ов (ну, куб на который наложена текстура фона). Для полного понимания нужна практика.

- glClear – это просто очистка экрана (вообще-то буфера, но «экрана» звучит понятней)
GL_COLOR_BUFFER_BIT — значит, что мы чистим буфер цвета (изображение, которое мы видим)
GL_DEPTH_BUFFER_BIT — очистка Z буфера, того самого, который используется при тесте глубины... (в координатах экрана, координата Z — глубина)


- glBegin – собственно, объявление о том, что мы собрались рисовать... В параметры пихается способ рисования. Бывает
GL_TRIANGLES (3 вершины — треугольник),
GL_QUADS (4 вершины — квадрат),
GL_POINTS (1 вершина — точка),
GL_LINES (2 вершины — линия),
и много всяких разных.

- glEnd — объявление о том, что мы уже нарисовали.

glBegin и glEnd могут вызываться сколько угодно за кадр, так что не волнуйтесь.

- glVertex –рисование вершины. Формат команды таков: glVertexXY,где Х – количество вершин (от 2-x,y до 4-x,y,z,w) и Y – формат координат (желательно использовать single–тогда Y=f)

- glColor –задание цвета, должен быть вызван ДО рисования вершины с данным цветом. Формат идентичен glVertex.

- glNormal –задание нормали, должен быть вызван ДО рисования вершины. Используется для просчета освещения. Формат идентичен glVertex.

НО! Учтите! Видеокарты напрямую поддерживают только тип GL_FLOAT он же single, с
double могут быть большие проблемы.



А теперь началась математика...

Это Матрица, Нео!


Матрицы используются для описания трансформаций в пространстве. Матрица 3х3 представляет собой систему координат, т.е. Первая тройка – вектор оси Х, вторая – ось Y, третья – ось Z. И чтоб перевести точку в мировой системе координат в систему координат данной матрицы, нужно умножить её на координату этой точки...

Ничего, со временем все прийдёт... :)

В OpenGL есть 3 матрицы:

- GL_MODELVIEW
Собственно, это матрица активной камеры.

- GL_PROJECTION
Это проекционная матрица – служит для проекции из 3D мира в 2D — на экран.

- GL_TEXTURE
Матрица текстуры – регулирует, как накладывать текстуру на полигон.

- glMatrixMode – с помощью этой команды выбирается активная матрица из 3 перечисленных.

- glLoadIdentity – а это установление единичной матрицы трансформации... Когда я начинал программировать с помощью OpenGL, эта фраза меня убивала... Просто набор непонятных слов, ну в общем задает начальную, без каких либо изменений матрицу, вида:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

- glRotateN(a,x,y,z) – поворачивает активную матрицу на угол a по оси (x,y,z). В качестве N-может быть или f(если а-single)или d(а-double)
- glTranslateN(x, y, z) – задает перемещение на вектор (x,y,z). То есть, если мы находимся в точке (10,0,0) и сделаем glTranslatef(3,2,1), то мы будем уже в точке(13,2,1). N – или f, или d.

- gluPerspective(FOV, ClientWidth/ClientHeight, NEAR, FAR) – задает матрицу проецирования. Используется при активной GL_PROJECTION... Хотя никто не запрещал делать это и на GL_MODELVIEW, но смысл?

FOV – угол обзора. Если хотите сделать эффект «увеличивающих видеолинз» (X-Tension), то просто плавно измените 60 на меньшее число, не забывая вызывать FormResize (а именно gluPerspective).

NEAR – ближняя грань пирамиды видимости, все объекты, что ближе будут обрезаться.

FAR – дальняя грань пирамиды видимости, все объекты, что дальше будут обрезаться.

- glViewport – а, ну это процедура, задающая Viewport – область, куда будем сбрасывать буфер (т.е. рисовать).

- Context.PageFlip — сбрасывает буфер, ну рисует, короче. (на самом деле эта команда вызывает просто SwapBuffers)
Jurec
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - OpenGL
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010