【问题标题】:Segmentation fault when trying to wrap glGenVertexArrays call in a method尝试在方法中包装 glGenVertexArrays 调用时出现分段错误
【发布时间】:2014-08-14 21:40:54
【问题描述】:

我正在尝试在 Mac OS 上将“现代”OpenGL (3+) 与 SDL 2.0.3 和 C++ 一起使用,如果我直接调用 OpenGL 函数,它就可以工作,但是一旦我尝试将它包装在一个类中这是行不通的。更具体地说,我想将顶点数组对象存储为类成员并在其上的类方法中调用glGenVertexArrays,但这会导致段错误。

直接调用的最小工作示例(没有任何用处但不会崩溃):

#include <cstdlib>
#include <SDL.h>
#include <OpenGL/gl3.h>

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *sdlWindow = SDL_CreateWindow(
        "OpenGL Works",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640,
        480,
        SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI
    );
    SDL_GLContext sdlGLContext = SDL_GL_CreateContext(sdlWindow);

    unsigned int vertexArrayObject;

    // This works
    glGenVertexArrays(1, &vertexArrayObject);

    // Wait some seconds before closing the window
    SDL_Delay(3000);

    SDL_GL_DeleteContext(sdlGLContext);
    SDL_DestroyWindow(sdlWindow);

    return EXIT_SUCCESS;
}

无法使用简单的类(分段错误):

#include <cstdlib>
#include <memory>
#include <SDL.h>
#include <OpenGL/gl3.h>

class Graphics
{
    public:
        void createVAO();

    private:
        unsigned int vertexArrayObject;
};

void Graphics::createVAO()
{
    glGenVertexArrays(1, &this->vertexArrayObject);
}

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    SDL_Window *sdlWindow = SDL_CreateWindow(
        "OpenGL Shit",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640,
        480,
        SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI
    );
    SDL_GLContext sdlGLContext = SDL_GL_CreateContext(sdlWindow);

    std::unique_ptr<Graphics> g;

    g->createVAO();

    // Wait some seconds before closing the window
    SDL_Delay(3000);

    SDL_GL_DeleteContext(sdlGLContext);
    SDL_DestroyWindow(sdlWindow);

    return EXIT_SUCCESS;
}

glGenBuffers 也是如此。我想知道这是否只是由于我缺乏 C++ 技能而导致的“简单”C++ 问题,还是与 OpenGL 和/或 SDL 相关的更严重的问题。我在 Stack Overflow 上发现了很多具有类似症状的问题,但其中大多数是由于我根本没有使用的 GLUT 或 GLEW 缺少选项 glewExperimental = GL_TRUE; 或我拥有的缺少 OpenGL 上下文引起的,因为我能够在屏幕上绘制:

我希望有人能解释为什么会崩溃,因为我不能:(

我使用的是 Mac OS 10.9.3,编译器是 Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn),这是编译器调用:c++ -o OpenGLTest main.cpp -I /usr/local/include/SDL2 -lSDL2 -framework OpenGL

【问题讨论】:

  • &amp;this-&gt;vertexArrayObject 的意义何在?只需使用&amp;vertexArrayObject
  • @BrettHale 我喜欢这种表示法,以表明它是一个比使用下划线前缀(如m_)更好的成员;)

标签: c++ macos opengl opengl-3 sdl-2


【解决方案1】:
std::unique_ptr<Graphics> g;
g->createVAO();

您实际上在哪里填充 g 的东西?

现在看起来您正在取消引用 NULL 指针。

试试这个:

std::unique_ptr<Graphics> g( new Graphics );

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2016-07-25
    • 2016-03-10
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2015-08-27
    • 2023-03-11
    • 2013-12-21
    相关资源
    最近更新 更多