GLEW _First 是 nullptr
Posted
技术标签:
【中文标题】GLEW _First 是 nullptr【英文标题】:GLEW _First was 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,因为这是我第一次这样做,而且它似乎对我来说是正确的,所以我不确定。
【参考方案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 之后的括号。有些东西真的很微不足道,但这就是问题哈哈以上是关于GLEW _First 是 nullptr的主要内容,如果未能解决你的问题,请参考以下文章