2016-04-26 2 views
-2

Wie der Titel sagt, bekomme ich eine "Access Verletzung Lesen Ort 0x000000000" Fehler auf meinem Laptop, aber der Code ist von der Youtube-Kurs und die anderen Leute haben kein Problem mit es. Was könnte ich tun, um das zu beheben? Code wird buchstäblich von der Quelle kopiert.Getting "Access Verletzung Lesestelle 0x000000000" Fehler

Problem tritt auf, wenn bekommt auf der Linie Kompilieren

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

Code:

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

Bitte posten Sie eine [mcve], die das Problem reproduziert. – HolyBlackCat

+0

Es kann auftreten, wenn zuvor kein Kontext erstellt wurde. –

+0

Meine Frage ist, warum funktioniert es auf allen anderen Computern außer meiner. : D – Djole

Antwort

0

glGenBuffers ist eine Funktion, die Vergangenheit OpenGL-1.2 eingeführt wurde. Zur Zeit erfordert der ABI-Vertrag in Windows nur, dass OpenGL-1.1 von opengl32.dll bereitgestellt wird, und in Linux mit LSB-4 gibt der ABI-Vertrag nur OpenGL-1.2 an. LSB-5 wurde vor ein paar Monaten veröffentlicht, aber die meisten Systeme folgen ihm noch nicht.

Im Wesentlichen bedeutet dies, dass Sie für jede moderne OpenGL-Funktion die OpenGL-Funktionszeiger zur Laufzeit über den Erweiterungsmechanismus laden müssen. Entweder manuell (mühsam) oder mit einer Loader-Bibliothek.

Ohne Laden der Funktionszeiger die Symbole, die möglicherweise definiert werden - je nachdem, wie Sie die OpenGL-Header aufnehmen - möglicherweise nicht definiert. Einige OpenGL-Implementierungen können mehr Symbole exportieren, aber Sie können sich nicht darauf verlassen.

Es ist wichtig, dass Sie sich über das Laden von OpenGL-Funktionen und den OpenGL-Erweiterungsmechanismus informieren.

Verwandte Themen