MyTetra Share
Делитесь знаниями!
Краткий обзор основных команд OpenGL
26.09.2019
23:29
Текстовые метки: opengl
Раздел: Компьютер - Программирование - Компьютерная графика

Ниже приведены основные команды 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)


Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования