我試圖在Mac OS上使用SDL 2.0.3和C++的「現代」OpenGL(3+),並且如果我直接調用OpenGL函數,只要我嘗試在課堂中包裝它不起作用。更具體地說,我想存儲頂點數組對象作爲類成員,並在其上的類方法中調用glGenVertexArrays
,但這會導致段錯誤。與直接調用嘗試在方法中調用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++技能或者與OpenGL和/或SDL相關的更嚴重的問題而導致的「簡單」C++問題。我發現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
什麼'&這個 - > vertexArrayObject'點?只需使用&vertexArrayObject'。 –
@BrettHale我喜歡這種表示方式,表明它比使用'm_'這樣的下劃線前綴更好的成員;) –