среда, 20 января 2016 г.

Использование загрузчика функций OpenGL

    Если вы знакомы с историей развития OpenGL, то вы знаете, что Майкрософт несколько недолюбливает OpenGL, что не удивительно, ведь это прямой конкурент DirectX. Хотя в настоящее время OpenGL ощутимо уступает DirectX,  в прошлом было все иначе. В прочем сейчас речь пойдет не о истории.

    Дело в том, что в операционной системе Windows OpenGL ABI был заморожен в версии 1.1, это значит, что эта операционная система из коробки предоставляет чуть больше, чем ничего для работы с OpenGL. В прочем это не значит, что на винде нельзя получить доступ к новейшим функциям OpenGL'a. Чаще всего эту проблему решают с помощью использования библиотеки GLEW. Однако использование этой библиотеки значит таскать за собой кучу ненужного. Эта библиотека содержит все функции которые когда либо входили в OpenGL, а если вы хотите использовать функции OpenGL 4.x, то вам явно не нужны функции от других версий. Что бы избежать все этих неприятностей можно воспользоваться утилитой OpenGL Loader Generator, скачать можно тут.

Для того, что бы воспользоваться утилитой, нужно установить LUA, скачать можно тут.

Сгенерировать файлы для нужного вам профиля можно следующей командой:

lua LoadGen.lua -style=pointer_cpp -spec=gl -version=4.3 -profile=core core_4_3

Описание всех доступных аргументов можно найти тут.

В папке с утилитой появится файл: gl_core_4_3.hpp  и gl_core_4_3.cpp

Теперь достаточно добавить эти 2 файла в проект, что бы больше не таскать с собой GLEW, а так же избавиться от проблемы связанной с переборкой GLEW по разные версии.

Доступ к функциях в сформированных файлах будет осуществляться из пространства имен gl, т.е. вместо glBufferData(..)  нужно будет записать gl::BufferData(..).

Что бы в существующем проекте не вносить кучу правок, можно воспользоваться С-шным стилем оформления, для этого достаточно утилите передать другой стиль:

lua LoadGen.lua -style=pointer_c -spec=gl -version=4.3 -profile=core core_4_3

Для загрузки функций в cpp варианте, нужно написать следующий код:

gl::exts::LoadTest isLoaded = gl::sys::LoadFunctions();
if(!isLoaded ){
    // освободить ресурсы
    return;
}

'С' вариант:

int loaded = ogl_LoadFunctions();
if(loaded == ogl_LOAD_FAILED){
    // освободить ресурсы
    return;
}

Автоматическая загрузка функций 

GlLoadGen так же поддерживает автоиницилизиацию указателей. Этот режим можно включить с помощью передачи параметров в утилиту noload_c или noload_cpp в параметр -style. Включение этих параметров позволит избежать необходимости инициализации, но такой вариант влечет за собой небольшие накладные расходы на инициализацию функций, которая происходит при первом вызове.

Использование расширений 

Если вы хотите использовать какие то расширения, то вам потребуется их подключить явно указав их имя через параметр -extfile. Пример:

lua LoadGen.lua -style=pointer_cpp -spec=gl -version=4.3 -profile=core core_4_3 -exts ARB_texture_view ARB_vertex_attrib_binding





1 комментарий:

  1. Большое спасибо, такой статьи не хватало когда не мог разобраться в этом.

    ОтветитьУдалить