2014-06-24 53 views
3

我試圖在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上下文,這是因爲我能夠繪製屏幕:

我希望有人能解釋爲什麼這是崩潰,因爲我不能:(

我使用的是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

+0

什麼'&這個 - > vertexArrayObject'點?只需使用&vertexArrayObject'。 –

+0

@BrettHale我喜歡這種表示方式,表明它比使用'm_'這樣的下劃線前綴更好的成員;) –

回答

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

你究竟在哪裏填寫g

現在,它看起來像你解除引用NULL指針。

試試這個:

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

對我而言,我簡直忘了,但現在它就像一個魅力!我覺得沒有看到這個愚蠢......謝謝反正! –

相關問題