Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к ЛР_v0.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
587 Кб
Скачать
☆

Подключение и инициализация 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-контекст.