【发布时间】: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 上下文引起的,因为我能够在屏幕上绘制:
- Segmentation fault at glGenVertexArrays( 1, &vao );
- Program Crash on glGenVertexArrays call
- Implementing VBO in OpenGL, the window stay black
- OpenGL Segfaults on glGenVertexArrays
我希望有人能解释为什么会崩溃,因为我不能:(
我使用的是 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
【问题讨论】:
-
&this->vertexArrayObject的意义何在?只需使用&vertexArrayObject。 -
@BrettHale 我喜欢这种表示法,以表明它是一个比使用下划线前缀(如
m_)更好的成员;)
标签: c++ macos opengl opengl-3 sdl-2