OpenGL альтернативы GLEW, который имеет определенные аргументы или решение для него



Поэтому я опубликовал вопрос, аналогичный этому в stackoverflow, но решение казалось, что его можно решить более простым решением.



В основном, я использую GLEW для загрузки моих заголовочных файлов OpenGL и т. д., без проблем, но поскольку я использую VIM и Clang_Complete для завершения аргумента, я застрял с тем, чтобы иметь только имя завершено и не иметь никаких аргументов на самом деле показано. Поскольку, по-видимому, функции определяются как



#define FOO somefunction


И не определен как



#define FOO(arg1, arg2, arg3) somefunction(arg1, arg2, arg3)


Моим решением было добавление опции в мой ~/.файл vimrc и необходимость полностью удалить GLEW и заменить его на



#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>


Итак, мне интересно, есть ли альтернатива GLEW, которая делает то, что делает GLEW, но на самом деле показывает аргументы, или есть способ решить эту проблему с помощью GLEW.

652   2  

2 ответов:

В интересах полного раскрытия я написал следующий инструмент. Прошу прощения, если это звучит как реклама.

Вы можете использовать генератор загрузчика OpenGL. Это инструмент, который генерирует заголовки и исходные файлы для загрузки функций OpenGL. Вы указываете, какие расширения и версии OpenGL вас интересуют, и он выводит только перечисления и функции для этих версий. Это основная функция инструмента: получение чистых заголовков и исходных файлов, которые содержат только то, что вы собираетесь использовать.

Но вторичная особенность состоит в том, что он имеет разные стили генерации. Эти стили определяют специфику того, как генерируются выходные данные.

Стандартный стиль "pointer_c" генерирует код, который очень похож на GLEW, где функции #defines. это на самом делесущественно В C, потому что вы не можете переопределить глобально доступные переменные/имена функций. Таким образом, вы не можете определить указатель функции, который имеет то же имя, что и функция без указателя. Например, glVertex3f; это имя уже определено библиотекой OpenGL на некоторых платформах, поэтому вы не можете определить его новую версию. Вы должны #define обойти его.

C++, с другой стороны, имеет пространства имен. Таким образом, в стиле "pointer_cpp" вы получаете заголовки C++ и исходный код, который помещает большую часть OpenGL в пространство имен gl. Это также означает, что стиль указателя CPP не должен использовать #defines. Так что это не так. gl::Vertex3f - указатель на функцию с реальными типами аргументов и имена. Любой приличный инструмент завершения кода должен быть в состоянии понять их.

Стиль "noload_cpp" делает то же самое. Разница в том, что нет никакой функции инициализации, которую вы должны вызвать; вы можете вызвать любой указатель функции, и он будет динамически загружать эту функцию, если она еще не была загружена.

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

Вот мое решение:

#ifdef USE_GLEW
    #include <GL/glew.h>
#else
    #warning "Not using GLEW"
    #define GL_GLEXT_PROTOTYPES
    #include <GL/gl.h>
    #include <GL/glext.h>
#endif

И...

// Initialize GLEW
#ifdef USE_GLEW
    glewExperimental = GL_TRUE;
    if (glewInit())
    {
        fprintf(stderr, "Failed to initialize GLEW.\n");
    }
#endif

Затем добавьте флаг -DUSE_GLFW в Makefile или CMakeList.формат txt. но не надо добавлять .ycm_extra_conf.py

Comments

    Ничего не найдено.