GLFW не может загрузить все функции GL ES 2.0

Я пытаюсь настроить GLFW для создания окна и контекста OpenGL ES 2.0, так как мне нужно что-то из коробки для управления обратными вызовами ввода и т. Д. Проблема в том, что если я использую следующую настройку:

    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
    glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    glfwindow  = glfwCreateWindow(width, height, "Window Title", NULL, NULL);
    if (!glfwindow)
    {
        glfwTerminate();
        exit(1);
    }

    glfwMakeContextCurrent(glfwindow);

Использование GLFW_NATIVE_CONTEXT_API для подсказки GLFW_CONTEXT_CREATION_API дает мне следующую информацию о поставщике:

Версия GL: OpenGL ES 3.2 NVIDIA 368.69 GL Производитель: NVIDIA Corporation Модуль визуализации GL: GeForce GTX 960M / PCIe / SSE2 Версия GLSL: OpenGL ES GLSL ES 3.20

Тогда не удается даже создать шейдер (glCreateShader ()) возвращает 0.

Но если вместо этого флага подсказки я использую GLFW_EGL_CONTEXT_API, мне удается выполнить большинство процедур GL, таких как загрузка шейдеров, компиляция и компоновка программы, настройка GL VBO и т. Д. Но тогда я не могу выполнить glDrawElements () .

И если я распечатаю информацию о продавце с этой настройкой, я увижу следующее:

Версия GL: 4.5.0 NVIDIA 368.69 GL Производитель: NVIDIA Corporation Модуль визуализации GL: GeForce GTX 960M / PCIe / SSE2 Версия GLSL: 4.50 NVIDIA

Поэтому для меня довольно странно, что, когда EGL предположительно должен быть базовым API для создания контекста, я получаю настольный OpenGL набор.

Также, если я попытаюсь получить указатель на функцию для glDrawElements вручную, он вернет null.

PFNGLDRAWELEMENTSPROC func = reinterpret_cast<PFNGLDRAWELEMENTSPROC>
(eglGetProcAddress("glDrawElements"));

Я хотел бы понять, в чем может быть проблема и как правильно использовать GLFW для создания контекста GL ES.


person Michael IV    schedule 13.08.2016    source источник
comment
На какой платформе вы с этим сталкиваетесь?   -  person Nicol Bolas    schedule 13.08.2016
comment
Думаю, я решил. У меня был opengl32.lib, связанный до egl и gles lib. Я удалил его, и он начал работать. Нужно меньше читать со всякого рода модных форумов.   -  person Michael IV    schedule 13.08.2016


Ответы (1)


Поскольку никто не ответил на мой вопрос, и поскольку я давно выяснил корень проблемы, вот объяснение:

GLFW отлично работает для инициализации контекста GLES. Проблема связана с подключенными библиотеками. При эмуляции GLES в Windows нельзя связываться с opengl32.lib. В моем случае я использую PowerVR SDK и его библиотеки ES2 и ES3. Поэтому следующие библиотеки обязательны:

glfw3.lib

libEGL.lib

libGLESv2.lib

В моем компоновщике, поскольку по умолчанию я использовал настольный OpenGL, я также связывал с opengl32.lib, который, вероятно, имел приоритет перед другими библиотеками GL. Убедитесь, что вы исключили его при запуске GLES на настольная платформа.

person Michael IV    schedule 19.12.2016