![]() |
|
![]() |
![]() |
Новости | Конференция | Чат | База данных | Творчество | Сообщество | О сайте | English |
![]() |
Помощь сайту |
![]() |
![]() |
![]() |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Глава 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)
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |
![]() |