【问题标题】:GLEW _First was nullptrGLEW _First 是 nullptr
【发布时间】:2017-02-23 20:05:44
【问题描述】:

所以我一直在使用 GLFW 和 GLEW 通过 C++ 开发游戏,一切都很顺利,直到我实现了 GLEW,然后我收到了一个我以前从未遇到过的错误,我不知道该怎么做,我用谷歌搜索并做了一些研究,但无济于事。我注意到在堆栈框架部分它说与我的 main.cpp 中的这行代码有关

std::cout << glGetString(GL_VERSION) << std::endl;

它还说与记忆有关。我会将其余代码留在下面,如果您需要任何信息,请尽管询问,我会尽力提供

所以我才发现如果我拿出来

std::cout << glGetString(GL_VERSION) << std::endl;

然后它可以工作,但是没有创建窗口。

我从这里去哪里? 有什么想法吗?

   #include "src\graphics\window.h"
int main() {
    using namespace benji;
    using namespace graphics;

    Window window("Benji Engine", 1280, 720);
    glClearColor(0.2f, 0.3f, 0.8f, 1.0f);
    std::cout << glGetString(GL_VERSION) << std::endl;``

    while (!window.closed()) {
        std::cout << window.getWidth() << ", " << window.getHeight() << std::endl;
        window.clear();
        glBegin(GL_TRIANGLES);
        glVertex2f(-0.5f, -0.5f);
        glVertex2f(0.0f, 0.5f);
        glVertex2f(0.5f, -0.5f);
        glEnd();
        window.update();
    }

    return 0;
}

main.h

 #pragma once
    class main
    {
    public:
        main();
        ~main();
    };

window.cpp

#include "window.h"

namespace benji { namespace graphics {


void windowResize(GLFWwindow *window, int width, int height);

Window::Window(const char *title, int width, int height) {
    m_Title = title;
    m_Width = width;
    m_Height = height;
    if (!init()) {
        glfwTerminate();
    }

}

Window::~Window() {
    glfwTerminate();

}

bool Window::init() {
    if (!glfwInit()) {
        std::cout << "Failed to initialize GLFW!" << std::endl;
        return false;
    }

    m_Window = glfwCreateWindow(m_Width, m_Height, m_Title, NULL, NULL);
    if (!m_Window) {
        std::cout << "Failed to create GLFW window!" << std::endl;
        return false;
    }
    glfwMakeContextCurrent(m_Window);
    glfwSetWindowSizeCallback(m_Window, windowResize);

    if (glewInit != GLEW_OK) {
        std::cout << "GLEW FAILED!" << std::endl;
        return false;
    }
    return true;


}

void Window::clear() const {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void Window::update(){
    glfwPollEvents();
    glfwSwapBuffers(m_Window);


}

    bool Window::closed() const {
    return glfwWindowShouldClose(m_Window) == 1;
}

    void windowResize(GLFWwindow *window, int width, int height) {
        glViewport(0, 0, width, height);
    }
}}

window.h

 #pragma once
    #include <iostream>
    #include <GL\glew.h>
    #include <GLFW\glfw3.h>

namespace benji {
    namespace graphics {
        class Window {
        private:
            const char *m_Title;
            int m_Width, m_Height;
            GLFWwindow *m_Window;
            bool m_Closed;

        public:
            Window(const char *title, int width, int height);
            ~Window();
            bool closed() const;
            void update();
            void clear() const;

             int getWidth() const {
                return m_Width;

            }
             int getHeight() const { return m_Height; }
        private:
            bool init();

        };
}

}

【问题讨论】:

  • 完整的错误是什么?你有调试调用堆栈或任何其他信息吗?
  • 我能看到的唯一其他错误是抛出异常:读取访问冲突。 _First 是 nullptr。
  • 如果glGetString确实崩溃了,那是因为你的OpenGL没有被正确初始化。您在Window::init 期间是否收到任何错误输出?这也得到了以下事实的支持:当您删除对glGetString 的调用时,它不会崩溃,但不会打开任何窗口。另见“Why Could glGetString(GL_VERSION) Be Causing a Seg Fault?
  • 我一直在按照教程来初始化 OpenGL,因为这是我第一次这样做,而且它似乎对我来说是正确的,所以我不确定。

标签: c++ glfw glew


【解决方案1】:

在 Window.cpp 中:

if (glewInit != GLEW_OK) {
    std::cout << "GLEW FAILED!" << std::endl;
    return false;
}

glewInit() 是一个函数,而不是一个变量。您需要将其作为函数调用。我很惊讶这甚至被编译了。

来自 1.1 版之后的所有其他 OpenGL 函数将抛出 ACCESS_VIOLATION READING ADDRESS 0x00000000 或类似错误的错误,因为如果未正确调用 glewInit(),则 GLEW 提供的函数宏都不会指向有效函数指针。

【讨论】:

  • I'm surprised this even compiled,如果这不仅仅是将代码复制到问题中的错误,我也是。但是很好,我设法多次看过去。
  • @ssell 我不久前停止使用 GLEW(切换到 glBinding)并且不记得 GLEW 是否使所有内容都衰减为函数指针,或者只是 gl* 函数本身。如果它对所有事情都这样做,那至少可以解释程序编译的原因(但不能正确运行)。
  • 那么你会建议不要使用 GLEW 吗?
  • @RyanMidgley 我不会在这方面提出建议。与 GLEW 的界面相比,我个人更喜欢 glBinding 的界面,但并不是每个人都会有同样的感受。
  • 只是想让你知道我是如何修复它的,我忘记了 glewInit 之后的括号。有些东西真的很微不足道,但这就是问题哈哈
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2022-07-16
  • 2010-11-19
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多