-2

Wenn ich nicht falsch bin, bedeutet "Zugriffsverletzung lesen Speicherort 0x00000000" bedeutet, Sie versuchen, einen Zeiger, der noch initialisiert werden muss, zu unterscheiden, weshalb ich bei diesem Fehler ratlos bin. Unten ist mein Code eingefügt, mit einem Kommentar, der angibt, wo der Visual Studio-Debugger mir sagt, dass der Fehler auftritt. Es verwirrt mich, weil keines der Argumente, die ich in die Funktion übergebe, Zeiger sind. Irgendwelche Ideen?Zugriff Verletzung Leseort 0x00000000 trotz keine Zeiger

void Mesh::Render(Shader* shader) 
{ 
    glBindVertexArray(m_vao); 
    glEnableVertexAttribArray(shader->GetAttributeLocation("position")); 
    glVertexAttribPointer(0, 3, GL_FALSE, GL_FALSE, sizeof(Vertex), 0); 

    glDrawElements(GL_TRIANGLES, m_size, GL_UNSIGNED_INT, 0); // error here 

    glDisableVertexAttribArray(shader->GetAttributeLocation("position")); 
    glBindVertexArray(0); 
} 

m_size als nicht Zeiger integer deklariert

Und wenn es überhaupt hilft, der Debugger führt mich zu einer Quelle, die nicht verfügbar, so dass der Debugger Punkte in der Demontage auf dieser Linie stattdessen :

001DFEC7 mov   edi,dword ptr [esi] 

Ich weiß nicht Assembly, ich bin mir nicht sicher, ob das überhaupt irgendeine Hilfe ist.

EDIT

Falls jemand wurde fragen, ich den Element-Array-Puffer für die Verwendung von vaos erforderlich bin binden. Der Rest der Klasse ist Mesh unterhalb

Mesh::Mesh() 
{ 
    glGenVertexArrays(1, &m_vao); 
    glGenBuffers(1, &m_vbo); 
    glGenBuffers(1, &m_ibo); 
    m_size = 0; 
} 

Mesh::~Mesh() 
{ 
    glDeleteVertexArrays(1, &m_vao); 
    glDeleteBuffers(1, &m_vbo); 
    glDeleteBuffers(1, &m_ibo); 
} 

void Mesh::AddVertices(Vertex* vertices, int vertSize, int* indices, int indexSize) 
{ 
    m_size = indexSize; 

    glBindVertexArray(m_vao); 

    glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 
    glBufferData(GL_ARRAY_BUFFER, vertSize * sizeof(Vertex), vertices, GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(int), indices, GL_STATIC_DRAW); 

} 
+2

sicher gibt es Zeiger. 'this' ist ein Zeiger,' shader' ist ein Zeiger, das letzte Argument für 'glVertexAttribPointer' ist ein Zeiger (den Sie auf Null gesetzt haben ....) –

+0

Sind ** m_vao ** und andere hier verwendete Variablen alle global ? –

+0

[Wie in dieser Frage erwähnt] (http://stackoverflow.com/q/23026612/1287251) (und andere), haben Sie einen ungültigen Puffer gebunden, auf den nur zugegriffen wird, wenn 'glDrawElements' aufgerufen wird. Sie sollten alle Ihre Aufrufe von OpenGL-Funktionen testen, um festzustellen, ob einige von ihnen fehlschlagen. Es ist möglich, dass einer von ihnen fehlgeschlagen ist, also haben Sie keine gültige Puffergrenze, aber Sie versuchen dennoch, mit dem Rendern fortzufahren. – Cornstalks

Antwort

1

Die beiden anderen Antworten hier sind nur teilweise richtig. glDrawElements erwartet, dass der letzte Parameter ein Zeiger auf einige Indizes ist. Doch im Gegensatz zu dem, was anderen Antworten vorschlagen, es ist in Ordnung, wenn dieser Parameter 0 (NULL), weil:

die indices Parameter von glDrawElements [...] als einen im Pufferobjekt versetzt interpretiert in Basismaschine gemessen Einheiten.

wenn Sie glBindBuffer mit GL_ELEMENT_ARRAY_BUFFER anrufen.

Wenn dies der Fall ist, bedeutet der Segfault, dass ein vorheriger Aufruf einer OpenGL-Funktion fehlgeschlagen ist und Sie keinen gültigen Puffer gebunden haben. Wenn Sie glDrawElements aufrufen, hat es keinen gültigen Puffer, um damit zu arbeiten, so dass es segfolds. Check every OpenGL function call for success um herauszufinden, welcher Fehler aufgetreten ist.

+0

Es ist wahrscheinlicher, dass das OP gerade keinen Element-Array-Puffer gebunden hat, als dass ein 'glBindBuffer' fehlgeschlagen ist. Vertex-Array-Objekte (VAOs) sind als Container für alle vertexbezogenen Daten gedacht: Vertex-Pufferobjekte (VBO) und Elementarrays, sodass Sie einfach einen einzigen Bindungsaufruf durchführen und alle Pufferbindungen aktualisieren können. – radical7

+0

Ich wusste vorher nicht über glGetError, also werde ich dies als die richtige Antwort markieren, nur der Unterschied war die Funktion, von der Sie glaubten, dass sie meine Probleme verursachen würde. Die eigentliche Ursache ist, dass ich 'GL_FALSE' versehentlich in den 3. Parameter von' glVertexAttribPointer' anstelle von 'GL_FLOAT' gesetzt habe, so wie es sein sollte. – BossLetsPlays

-1

Das letzte Argument nach this, ist ein „ein Zeiger auf die Stelle, wo der Indizes gespeichert werden.“

Sie haben eine 0, so dass es versucht, zu dereferenzieren Lage 0.

+0

Die Anweisung über einen Verweis, den Sie referenzieren, ist nur gültig, wenn OpenGL clientseitige Vertex-Arrays verwendet. Der OP-Code verwendet ein serverseitiges Vertex-Array (angegeben durch den Aufruf von 'glBindVertexArray'), das die Bedeutung des letzten Parameters dahingehend ändert, dass er ein Versatz in den gebundenen Element-Array-Puffer und nicht ein Zeiger ist. – radical7