gpt4 book ai didi

c++ - 尝试在方法中包装 glGenVertexArrays 调用时出现段错误

转载 作者:太空狗 更新时间:2023-10-29 20:40:24 33 4
gpt4 key购买 nike

我正在尝试在 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 上发现了很多具有类似症状的问题,但其中大部分是由于缺少选项 glewExperimental = GL_TRUE; 引起的,我根本没有使用 GLUT 或 GLEW 或缺少 OpenGL 上下文我有,因为我可以在屏幕上画画:

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

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

最佳答案

std::unique_ptr<Graphics> g;
g->createVAO();

您实际在哪里填充 g

现在看起来您正在解除对 NULL 指针的引用。

试试这个:

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

关于c++ - 尝试在方法中包装 glGenVertexArrays 调用时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24389813/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com