Примитивная графика - это не значит, что она будет слабенькой или ужасной. Это значит, что сложные объекты состоит из большого количества простых. Сегодня я постараюсь рассмотреть как можно больше примитивов, с помощью которых ты сможешь строить сложные сцены. Приготовься, урок будет большим, но очень познавательным. Для егё понимания тебе придётся вспомнить школьный курс геометрии (достаточно того, что ты проходил до 9-го класса).
Вообще-то, вся OpenGL графика построена на примитивах. Самым примитивным является Vertex (точка). С ней мы уже познакомились и умеем рисовать. Линии и квадраты я тоже опускаю, потому что мы уже очень много с ними работали. Единственное, что действительно будет для тебя новым, так это треугольники. Я почему-то до сих пор их не использовал, хотя это основа OpenGL. Вся графика в этой библиотеке просчитывается и рисуется с помощью треугольников.
Выдели минутку и рассмотри рисунок 1. Здесь представлены различные фигуры, но все они состоят из примитивов. Верхние фигуры сделаны из линий, средние из треугольников и нижние из квадратов.
Рис 1. Примитивы
Давай рассмотрим каждый примитив поподробнее, но для начала взглянём на новую процедуру:
glLineWidth(5);
Не надо много ума, чтобы догадаться, что эта процедура задаёт толщину линии. Она влияет только на рисование линий, на квадраты и треугольники она не влияет.
glBegin с параметром GL_LINES открывает набор линий. Я здесь рисую две параллельные линии разного цвета, а ты можешь нарисовать одну или даже 10. Между glBegin(GL_LINES); и glEnd должно быть чётное количество вершин. Если будет нечётное, то последняя будет просто отбрасываться и не повлияет на сцену.
glBegin с параметром GL_LINE_STRIP открывает набор линий с продолжением. Это значит, что конец первой линии будет являться началом второй, а конец второй, будет являться началом третей. Здесь может быть любое количество вершин. Почему? Подумай немного и ты поймёшь.
glBegin с параметром GL_LINE_LOOP открывает набор замкнутых линий. Этот примитив очень похож на предыдущий с одной только разницей - последняя вершина замкнётся с первой.
теперь перейдём к треугольникам. Для наглядности смотри на примитивы расположенные на рисунке в центре.
glBegin с параметром GL_TRIANGLES_STRIP рисует треугольники с замкнутыми вершинами. Последняя вершина первого треугольника является первой вершиной второго треугольника.
glBegin с параметром GL_TRIANGLE_FAN рисует треугольники с замкнутыми гранями. Последняя грань первого треугольника является первой гранью второго треугольника. Количество вершин может быть любым (не меньше трёх), потому что последняя грань хранит в себе уже две точки, и прибавив ещё одну получается новый треугольник.
Теперь мы переходим к квадратам. Здесь я буду писать сокращённо для экономии места. Ты и так уже должен всё хватать на лету.
glBegin(GL_QUADS);
Рисует квадраты. Количество вершин должно быть кратно 4-м.
glBegin(GL_QUAD_STRIP);
Рисует квадраты с общей гранью. Последняя грань первого квадрата является первой для второго. Количество вершин должно быть больше или равно 4-м и кратно 2-м.
glBegin(GL_POLYGON);
Рисует полигон. Это просто набор вершин объединённых между собой. Честно сказать, я не знал какой лучше пример привести. Мой пример не очень удачный, но попробуй сам поиграть с вершинами, подвигай их в разные стороны и посмотри на результат.
Вот и всё. Вначале мне казалось, что статья раздуется на десяток страниц, а оказалось всё не так уж и страшно. Теперь тебе не трудно будет нарисовать достаточно сложную сцену. Самое главное, чтобы хватило воображения.