无法使用GLFW3初始化GLew

时间:2014-01-06 05:13:16

标签: c++ opengl initialization glew glfw

我正在尝试初始化 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)

2 个答案:

答案 0 :(得分:1)

有些东西正在定义宏GLEW_MX,它用于为多个渲染上下文配置glew库。使用这种配置构建需要一些特殊的准备。以下内容来自http://glew.sourceforge.net/advanced.html(强调补充):

  

多个渲染上下文(GLEW MX)

     

从版本1.2.0开始,支持多线程的线程安全   渲染上下文,可能具有不同的功能,是   可用。由于大多数用户不需要这样做,因此不会添加   到二进制版本以保持不同的兼容性   版本。要包含多上下文支持,您必须执行此操作   以下内容:

     
      
  • 编译并使用GLEW并定义GLEW_MX预处理程序令牌。
  •   
  • 对于每个渲染上下文,创建一个GLEWContext对象,只要渲染上下文存在,该对象就可用。
  •   
  • 定义一个名为glewGetContext()的宏或函数,它返回一个指向与渲染相关联的GLEWContext对象的指针   发出OpenGL / WGL / GLX调用的上下文。这次派遣   机制是原始的,但是通用的。
  •   
  • 确保在每个渲染上下文中创建GLEWContext对象后调用glewInit()。注意,那是GLEWContext指针   由glewGetContext()返回必须驻留在全局或线程本地   存储器中。
  •   

如果您不需要多个渲染上下文,最好的方法是找出正在设置GLEW_MX的位置并修复它。

答案 1 :(得分:1)

以防万一有类似问题。 请在调用glfwMakeContextCurrent后尝试调用glewInit:)

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