Не могу инициализировать GLew с помощью GLFW3

Я пытаюсь инициализировать GLew 1.10 вместе с последней версией GLFW3. Мне удалось получить GLFW3 работает без проблем, а вот GLew довольно сложно. Я следовал примеру с веб-сайта GLew о том, как инициализировать, но glewInit() по какой-то причине не определено, а glewGetContext identifier not found / undefined (ошибки внизу):

#include <GLew110\glew.h>
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>

static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{   
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(800, 600, "Simple example", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    GLenum err = glewInit(); // <---- "glewGetContext" is undefined (line 29)
    if (GLEW_OK != err)
    {
        /* Problem: glewInit failed, something is seriously wrong. */
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

    }

    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    while (!glfwWindowShouldClose(window))
    {
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

ДВЕ ПЕРЕЧИСЛЕННЫЕ ОШИБКИ:

error C3861: 'glewGetContext': identifier not found (line 29 pointing to glewInit())
IntelliSense: identifier "glewGetContext" is undefined (line 29)

person Community    schedule 06.01.2014    source источник
comment
Это звучит как проблема компиляции/ссылки, но это не на 100% ясно из вопроса. Пожалуйста, опубликуйте полный небольшой образец программы, который показывает проблему (похоже, что программа, в которой нет ничего, кроме вызова glewInit(), поможет), и скопируйте/вставьте точные сообщения об ошибках.   -  person Michael Burr    schedule 06.01.2014
comment
@MichaelBurr спасибо за ответ. Я обновил код (рабочий) и перечислил две ошибки, которые я получил внизу. удаление кода, который предполагает инициализацию GLew, покажет вращающийся цветной треугольник.   -  person    schedule 06.01.2014
comment
glewinit должен быть после glfwMakeCurrentContext   -  person Anton D    schedule 06.01.2014
comment
Побочный комментарий: пожалуйста, не используйте обратную косую черту '\' в директивах включения.   -  person datenwolf    schedule 06.01.2014


Ответы (2)


Что-то определяет макрос GLEW_MX, который используется для настройки библиотеки glew для нескольких контекстов рендеринга. Строительство с такой конфигурацией требует специальной подготовки. Нижеследующее взято с http://glew.sourceforge.net/advanced.html (выделение добавлено) :

Несколько контекстов рендеринга (GLEW MX)

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

  • Скомпилируйте и используйте GLEW с определенным токеном препроцессора GLEW_MX.
  • Для каждого контекста рендеринга создайте объект GLEWContext, который будет доступен до тех пор, пока существует контекст рендеринга.
  • Определите макрос или функцию с именем glewGetContext(), которая возвращает указатель на объект GLEWContext, связанный с контекстом рендеринга, из которого выполняются вызовы OpenGL/WGL/GLX. Этот механизм диспетчеризации является примитивным, но универсальным.
  • Убедитесь, что вы вызываете glewInit() после создания объекта GLEWContext в каждом контексте рендеринга. Обратите внимание, что указатель GLEWContext, возвращаемый функцией glewGetContext(), должен находиться в глобальной или локальной памяти потока.

Если вам не нужны несколько контекстов рендеринга, лучше всего выяснить, где устанавливается GLEW_MX, и исправить это.

person Michael Burr    schedule 06.01.2014

На всякий случай, если у кого-то есть похожая проблема. Пожалуйста, попробуйте вызвать glewInit после вызова glfwMakeContextCurrent :)

/* Make the window's context current */
glfwMakeContextCurrent(window);
int glewErr = glewInit();
person Karol    schedule 21.05.2014