- •Предисловие
- •Лабораторная работа № 1. Знакомство с OpenGl с использованием кроссплатформенной библиотеки sdl
- •Теоретические сведения
- •Двумерная и трехмерная графика с помощью OpenGl
- •Подключение и инициализация OpenGl.
- •Расширенная работа с OpenGl-контекстом
- •Теоретические сведения
- •Линии: одиночные, ломаные, замкнутые ломаные.
- •Постановка задачи
- •Контрольные вопросы
- •Лабораторная работа № 2. Примитивы OpenGl, построение двумерных объектов, язык шейдеров.
- •Вывод примитивов на экран
- •Задание к лабораторной работе
- •Дополнительное задание
- •Лабораторная работа № 3. Аффинные преобразования. Трехмерные построения. Параллельная и перспективная проекции. Квадрик-объекты.
- •Лабораторная работа № 4. Камера. Освещение. Текстуры.
- •Контрольные вопросы.
- •Лабораторная работа № 5. Загрузка готовых моделей. Геометрические шейдеры. Анимация.
- •Библиографический список.
- •Оглавление
Подключение и инициализация OpenGl.
Для возможности вызова в программе функций OpenGL необходимо подключить следующие заголовочные файлы:
Для SDL: "gl.h" и "glu.h"
#include <GL/gl.h>
#include <GL/glu.h>
Для SDL2: "SDL_opengl.h"
#include <SDL2/SDL_opengl.h>
Непосредственно перед использованием функций OpenGL необходимо в настройках компоновщика добавить следующие библиотеки:
Для SDL: "OpenGL32.lib" и "GLu32.lib" (ОС Windows).
Для SDL2: "OpenGL32.lib" (ОС Windows), "libGL.so" (ОС Linux), "OpenGL.framework" (Mac OS X).
Либо воспользоваться функцией динамической загрузки библиотек OpenGL – SDL_GL_LoadLibrary, объявленной следующим образом:
extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path);
где path – платформозафисимое имя библиотеки OpenGL или NULL, – для загрузки библиотеки OpenGL по умолчанию.
Результат, возвращаемый функцией SDL_GL_LoadLibrary, указывает на успешность загрузки, если равен 0, или -1 в противном случае.
Обратите внимание, функция SDL_GL_LoadLibrary должна быть вызвана после инициализации SDL, но, прежде чем будет создано окно с поддержкой OpenGL контекста.
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
//сообщение об ошибке
}
/* ... */
if (SDL_GL_LoadLibrary(NULL) < 0) {
//сообщение об ошибке
}
/* Создание окна с поддержкой OpenGL */
Для корректного освобождения ресурсов по завершению работы приложения необходимо вызвать функцию SDL_GL_UnloadLibrary, объявленную следующим образом:
extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void);
Обратите внимание, при использовании динамической загрузки библиотеки OpenGL с помощью функции SDL_GL_LoadLibrary, для всех функций OpenGL (не только расширений!) необходимо получать адреса с помощью функции SDL_GL_GetProcAddress, объявленную следующим образом:
extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress
(const char *proc);
где proc – имя OpenGL-функции, которую необходимо загрузить.
/* gl.h или SDL_opengl.h */
typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord);
/* cpp файл*/
PFNGLFOGCOORDFPROC glFogCoordf = NULL;
/* … */
/* Получаем адрес функции */
glFogCoordf = (PFNGLFOGCOORDFPROC)SDL_GL_GetProcAddress
("glFogCoordf");
/* … */
/* Вызов функции */
glFogCoordf(0.45f);
Для создания окна с поддержкой OpenGL-контекста, необходимо в функции создания окна указать следующий флаг:
Для SDL: SDL_OPENGL
/* Создание окна с поддержкой OpenGL */
SDL_Surface *screen = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
Для SDL2: SDL_WINDOW_OPENGL
/* Создание окна с поддержкой OpenGL */
SDL_Window *window = SDL_CreateWindow("OpenGL Application", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
Обратите внимание, в отличие от SDL, в SDL2 необходимо явно создать OpenGL-контекст воспользовавшись соответствующей функцией для создания контекста – SDL_GL_CreateContext, объявленную следующим образом:
extern DECLSPEC SDL_GLContext SDLCALL
SDL_GL_CreateContext(SDL_Window * window);
где window – указатель на окно, для которого необходимо создать OpenGL-контекст.
Результат, возвращаемый функцией SDL_GL_CreateContext, указывает либо на конкретный указатель SDL_GLContext, ассоциированной с соответствующим окном, либо NULL в случае ошибки.
SDL_GLContext glContext; /* OpenGL-контекст устройства */
/* … */
glContext = SDL_GL_CreateContext(window);
if (!glContext) {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Unable to create OpenGL context, error: %s", SDL_GetError());
return 1;
}
Для корректного освобождения ресурсов по завершению работы приложения необходимо вызвать функцию SDL_GL_DeleteContext, объявленную следующим образом:
extern DECLSPEC void SDLCALL SDL_GL_DeleteContext
(SDL_GLContext context)
где context – OpenGL-контекст, ресурсы которого необходимо освободить.
Для вывода сформированного растрового изображения на экран применяется функция SDL_GL_SwapWindow, объявленная следующим образом:
extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window);
где window – указатель на окно, для которого был создан OpenGL-контекст.
