Найти тему
GL Programming

Урок 4. Знакомство с примитивами для рисования OpenGL.

<- Предыдущий урок

Продолжаем цикл уроков по OpenGL. В 3 уроке мы инициализировали вот такое окно:

Теперь нарисуем первый примитив.

OpenGL использует правостороннюю систему координат, то есть ос Z по умолчанию направлена на зрителя. Путем манипуляций можно добиться и левосторонней системы, но пока оставим все как есть.

-2

В OpenGL существуют следующие два вида проекции:

Ортографическая - представьте некий прямоугольник в пространстве, центр которого находится в точке X = 0, Y = 0, Z = 0, и все что попадает внутрь этой прямоугольной области выводится на экран. И при этом хоть ось Z и существует, но объекты, в зависимости от расстояния, не уменьшаются. Поле зрения при такой проекции составляет 90 градусов.

Ортографическая
Ортографическая

Перспективная - другими словами, вид от первого лица. Есть ограниченный угол поля зрения, и чем дальше объект тем он меньше. А так же существуют передняя плоскость отсечения и задняя. А все что попадает в такую "Пирамиду" выводится на экран.

Перспективная
Перспективная

По умолчанию OpenGL использует ортогональную проекту с размерами X(-1.0; 1.0), Y(-1.0; 1.0) и Z(-1.0; 1.0). На первое время нам этого хватит. В следующем уроке познакомимся с матрицами, а так же поиграем с проекцией.

Для рисования используются две функции:

glBegin(unsigned int mode) - начало рисования, а в качестве аргумента передаем, какой примитив хотим нарисовать.

glEnd() - конец рисования, аргументов не имеет.

Для того, чтобы нарисовать практически любую фигуры достаточно использовать: точку, линию или треугольник. Однако OpenGL имеет следующие примитивы.

Изображения находится в свободном доступе.
Изображения находится в свободном доступе.

GL_POINT - точка

GL_LINES - линия

GL_LINE_STRIP - ломанная

GL_LINE_LOOP - тоже ломанная, но начало и конец объединяются

GL_POLYGON - полигон

GL_QUADS - четырехугольник

GL_QUAD_STRIP - тоже четырехугольник, но последняя сторона предыдущего четырехугольника служит началом для следующего.

GL_TRIANGLES - треугольник

GL_TRIANGLE_STRIP - тоже что и GL_QUAD_STRIP, но для треугольников

GL_TRIANGLE_FAN - все треугольники рисуются относительно первой указанной вершины

Для того чтобы указать вершину для рисование есть следующие функции:

glVertex2d(double x, double y)

glVertex2dv(const double* v)

glVertex2f(float x, float y)

glVertex2fv(const float* v)

glVertex2i(int x, int y)

glVertex2iv(const int* v)

glVertex2s(short x, short y)

glVertex2sv(const short* v)

glVertex3d(double x, double y)

glVertex3dv(const double* v)

glVertex3f(float x, float y)

glVertex3fv(const float* v)

glVertex3i(int x, int y)

glVertex3iv(const int* v)

glVertex3s(short x, short y)

glVertex3sv(const short* v)

glVertex4d(double x, double y)

glVertex4dv(const double* v)

glVertex4f(float x, float y)

glVertex4fv(const float* v)

glVertex4i(int x, int y)

glVertex4iv(const int* v)

glVertex4s(short x, short y)

glVertex4sv(const short* v)

Цифра указывает какие именно координаты устанавливать:

  • 2 - x и y
  • 3 - x, y и z
  • 4 - так как OpenGL использует матрицу 4x4, то есть возможность установить и 4 значение, но пока об этой не стоит думать.

Первый символ после цифры указывает на принимаемый тип данных:

  • d - double
  • f - float
  • i - int
  • s - short

Если в конце стоит символ v, значит функция принимает указатель на структура координат точки.

Все вершины должны указываться внутри конструкции glBegin - glEnd.

Цвет можно установить с помощью следующих функций. По умолчанию установлен белый цвет.

glColor3b(char red, char green, char blue)

glColor3bv(const char* v)

glColor3ub(unsigned char red, unsigned char green, unsigned char blue)

glColor3ubv(const unsigned char* v)

glColor3f(float red, float green, float blue)

glColor3fv(const float* v)

glColor3d(double red, double green, double blue)

glColor3dv(const double* v)

glColor3i(int red, int green, int blue)

glColor3iv(const int* v)

glColor3ui(unsigned int red, unsigned int green, unsigned int blue)

glColor3uiv(const unsigned int* v)

glColor3s(short red, short green, short blue)

glColor3sv(const short* v)

glColor3us(unsigned short red, unsigned short green, unsigned short blue)

glColor3usv(const unsigned short* v)

glColor3b(char red, char green, char blue)

glColor4bv(const char* v)

glColor4ub(unsigned char red, unsigned char green, unsigned char blue)

glColor4ubv(const unsigned char* v)

glColor4f(float red, float green, float blue)

glColor4fv(const float* v)

glColor4d(double red, double green, double blue)

glColor4dv(const double* v)

glColor4i(int red, int green, int blue)

glColor4iv(const int* v)

glColor4ui(unsigned int red, unsigned int green, unsigned int blue)

glColor4uiv(const unsigned int* v)

glColor4s(short red, short green, short blue)

glColor4sv(const short* v)

glColor4us(unsigned short red, unsigned short green, unsigned short blue)

glColor4b(char red, char green, char blue)

Цвет устанавливается в формате соотношений Красный - Зеленый - Синий + Прозрачность. Цифра указывает на количестве принимаемых параметров:

  • 3 - Красный - Зеленый - Синий
  • 4 - Красный - Зеленый - Синий - Прозрачность

Первый символ после цифры на тип данных:

  • u - значить unsigned
  • b - char
  • s - short
  • i - int
  • f - float
  • d - double

Важно помнить, что при установке цвета, для целого числа использовать диапазон от 0 до 255(кроме b, так как без ключевого слова unsigned, байт может принимать диапазон от 0 до 127). Для float и double от 0.0 до 1.0.

Цвет не обязательно указывать внутри конструкции glBegin() - glEnd(). Однако один раз указанный цвет, будет применен для всех следующих нарисованных примитивов.

Начнем рисовать. Пускай первым примитивом будет точка. Вспоминаем, что по умолчанию используется ортографическая проекция в пределах X(-1.0; 1.0), Y(-1.0; 1.0) и Z(-1.0; 1.0). При ортографической проекции ось Z отклоняется.

Переходим к функции GLRenderScene()(если не знаете, для чего она, см. Урок 3) и нарисуем точку красным цветом в центре окна.

-6

И запускаем:

Круг я сам добавил для обозначения точки
Круг я сам добавил для обозначения точки

Отлично. А теперь нарисуем линию, скажем зеленого цвета, от -0.5, -0.5 до 0.5, 0.5.

-8

Запускаем:

-9

На последок нарисуем треугольник, каждая вершина которого будет иметь свой цвет.

-10

Запускаем:

-11

На этом закончим третий урок. В следующем уроке поговорим о матрице.

Если понравилась статья то ставь лайк и подпишись на канал. Так же оставляй в комментарии если возникли вопросы.