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