среда, 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





понедельник, 18 января 2016 г.

Autodesk Maya 2015 - Invalid file type specified: OBJexport

Сегодня коллега попросила помочь с плагином к майке, он упорно не хотел работать и плевался ошибкой:

    uvlayout_open.mel line 817: Invalid file type specified: OBJexport

Как я понял, что то там в майке автоматически не подгрузилось для работы этого скрипта.
Так как я программист, который плохо знаком с Майкой, а еще жутко ленив(особенно в 12 ночи), я решил не церемониться, и просто сказал скрипту загрузить то, чего ему не хватает.

Что бы это сделать, достаточно добавить следующие строки в скрипт:

if ( !`exists objExport`) {
    loadPlugin objExport;
}

Сам файл тут: C:\Users\$UserName\Documents\maya\2015-x64\prefs\scripts\uvlayout_open.mel

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

blogInit()

Где то пол года назад я начал работу CG индустрии разработчиком и обнаружил, что в этой сфере, в отличии от промышленной разработки и геймдева, есть еще очень много "неизведанного", особенно в России. Более того, как оказалось в этой индустрии наблюдается острая нехватка специалистов. Например когда я писал плагин для Nuke, а это один из дефолтных инструментов для композа, обнаружил, что по существу и спросить не у кого и во многом приходилось разбираться методом научного тыка. Даже на SO на данный момент опубликовано лишь 46 вопросов, да и на официальном форуме не сильно лучше показатели, не говоря о том, что на ~5 вопросов опубликованных там, я получил ноль ответов :)
В общем ситуация достаточно кислая, по этому я решил завести бложик, где я буду публиковать заметки на CG тематику, которые может быть кому то будут полезны :)