Продолжаем цикл уроков по OpenGL. В 3 уроке мы инициализировали вот такое окно:
Теперь нарисуем первый примитив.
OpenGL использует правостороннюю систему координат, то есть ос Z по умолчанию направлена на зрителя. Путем манипуляций можно добиться и левосторонней системы, но пока оставим все как есть.
В 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) и нарисуем точку красным цветом в центре окна.
И запускаем:
Отлично. А теперь нарисуем линию, скажем зеленого цвета, от -0.5, -0.5 до 0.5, 0.5.
Запускаем:
На последок нарисуем треугольник, каждая вершина которого будет иметь свой цвет.
Запускаем:
На этом закончим третий урок. В следующем уроке поговорим о матрице.
Если понравилась статья то ставь лайк и подпишись на канал. Так же оставляй в комментарии если возникли вопросы.