2016-04-26 16 views
-2

タイトルによれば、私のラップトップでは「アクセス違反の場所は0x000000000」というエラーが表示されていますが、コードはYouTubeのコースからのもので、他の人には問題はありませんそれ。これを解決するにはどうすればよいですか?コードは文字通りソースからコピーされます。コンパイルが行「アクセス違反の場所を読み取る0x000000000」エラー

if (_vboID == 0) { 
     glGenBuffers(1, &_vboID); 
    } 

コードを取得するとき

問題が発生します。

void MainGame::initSystems() { 
//Initialize SDL 
SDL_Init(SDL_INIT_EVERYTHING); 

//Open an SDL window 
_window = SDL_CreateWindow("Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, _screenWidth, _screenHeight, SDL_WINDOW_OPENGL); 
if (_window == nullptr) { 
    fatalError("SDL Window could not be created!"); 
} 

//Set up our OpenGL context 
SDL_GLContext glContext = SDL_GL_CreateContext(_window); 
if (glContext == nullptr) { 
    fatalError("SDL_GL context could not be created!"); 
} 

glewExperimental = true; 

//Set up glew (optional but recommended) 
GLenum error = glewInit(); 
if (error != GLEW_OK) { 
    fatalError("Could not initialize glew!"); 
} 
if (error == GLEW_OK) { std::cout << "GLEW DID INIT!\n"; } 

//Tell SDL that we want a double buffered window so we dont get 
//any flickering 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

//Set the background color to blue 
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
} 

void Sprite::init(float x, float y, float width, float height) { 
//Set up our private vars 
_x = x; 
_y = y; 
_width = width; 
_height = height; 

//Generate the buffer if it hasn't already been generated 
if (_vboID == 0) { 
    glGenBuffers(1, &_vboID); 
} 

float vertexData[12]; 

//First Triangle 
vertexData[0] = x + width; 
vertexData[1] = y + height; 

vertexData[2] = x; 
vertexData[3] = y + height; 

vertexData[4] = x; 
vertexData[5] = y; 

//Second Triangle 
vertexData[6] = x; 
vertexData[7] = y; 

vertexData[8] = x + width; 
vertexData[9] = y; 

vertexData[10] = x + width; 
vertexData[11] = y + height; 

//Tell opengl to bind our vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
//Upload the data to the GPU 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); 

//Unbind the buffer (optional) 
//glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 
+5

問題を再現する[mcve]を投稿してください。 – HolyBlackCat

+0

以前に作成されたコンテキストがない場合に発生する可能性があります。 –

+0

私の質問は、それが私以外の他のすべてのコンピュータで動作する理由です。 :D – Djole

答えて

0

glGenBuffersのOpenGL-1.2を超えて導入された機能です。 Windowsの現時点では、ABI契約ではOpenGL-1.1のみがopengl32.dllで公開されている必要があり、LinuxではLSB-4でABI契約ではOpenGL-1.2のみが指定されています。数ヶ月前にLSB-5がリリースされましたが、ほとんどのシステムはまだそれに従っていません。

これは現代のOpenGL関数の場合、実行時に拡張機構を介してOpenGL関数ポインタをロードする必要があることを意味します。手動(退屈)またはローダーライブラリを使用しています。

関数ポインタをロードせずに、定義可能なシンボル(OpenGLヘッダーの組み込み方法によって異なります)は定義されていない可能性があります。いくつかのOpenGLの実装では、より多くのシンボルをエクスポートするかもしれませんが、それに頼ることはできません。

OpenGL関数の読み込みとOpenGL拡張メカニズムについて教えてください。

関連する問題