OpenGL (Open Graphics Library) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
Я уже писал о написании простейшего двумерного приложения. Теперь же напишем «приложение в объёме».
Для написания нам всё также понадобится библиотека glut. Можете ознакомится с её азами пройдя по ссылке выше.
Открыв и настроив вашу среду разработки, подключим такие заголовочные файлы:
#include <stdio.h> #include <GL/freeglut.h>
Предопределим размеры окна и его заголовок.
#define WINDOW_TITLE_PREFIX "How2.org.ua tutorial" int CurrentWidth = 800, CurrentHeight = 600, WindowHandle = 0;
Объявим прототипы функций:
void Initialize(int, char*[]); /// инициализация glut void InitWindow(int, char*[]); // инициализация окна void ResizeFunction(int, int); // установка размеров окна void RenderFunction(void); // функция рендеринга
В функции инициализации вызовим функция инициализации окна и выведем в консоль версию opengl:
void Initialize(int argc, char* argv[]){
InitWindow(argc, argv);
fprintf(
stdout,
"INFO: OpenGL Version: %s\n",
glGetString(GL_VERSION)
);
}
Функция инициализирующая окно:
void InitWindow(int argc, char* argv[]){
/* подробнее о функциях вызванных ниже по ссылке выще ;) */
glutInit(&argc, argv);
glutSetOption(
GLUT_ACTION_ON_WINDOW_CLOSE,
GLUT_ACTION_GLUTMAINLOOP_RETURNS
);
glutInitWindowSize(CurrentWidth, CurrentHeight); // размер окна
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);
if(WindowHandle < 1) {
fprintf(
stderr,
"ERROR: Could not create a new rendering window.\n"
);
exit(EXIT_FAILURE);
}
glutReshapeFunc(ResizeFunction);
glutDisplayFunc(RenderFunction);
}
Функция resize (будет работать при изменении размера окна):
void ResizeFunction(int Width, int Height){
CurrentWidth = Width;
CurrentHeight = Height;
glViewport(0, 0, CurrentWidth, CurrentHeight);
}
Ну а теперь, когда все приготовления кончились, рисуем треугольник (не будем делать объёмную фигуру, это долго, но делается аналогично — составлением плоских фигур):
GLfloat rtri; // градус поворота
void RenderFunction(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glOrtho(-200.0,200.0,-200.0,200.0,-200.0,200.0); ///зададим размеры координатной сетки
glRotatef(rtri,0.0f,1.0f,1.0f); //вращение вокруг оси oy oz
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f); // Красный цвет
glVertex3f( -100.0, 0,0);
glColor3f(0.0f,1.0f,0.0f); // Зеленный цвет
glVertex3f(0.0,100.0,0);
glColor3f(0.0f,0.0f,1.0f); // Синий цвет
glVertex3f( 100.0f,0.0,0);
glEnd();
glutSwapBuffers();
glutPostRedisplay();
rtri+=0.5f; // Увеличение переменной вращения для треугольника
}
Функция main вызывает всё это добро к исполнению:
int main(int argc,char**argv) {
Initialize(argc, argv);
glutMainLoop();
exit(EXIT_SUCCESS);
}
В linux компилируется командой:
g++ main.cpp -o main -lglut


