-2

Sauf erreur, "violation d'accès à la lecture de l'emplacement 0x00000000" signifie que vous essayez de déférer un pointeur qui n'a pas encore été initialisé, ce qui explique pourquoi je suis bloqué par cette erreur. Collé ci-dessous est mon code, avec un commentaire indiquant où le débogueur de studio visuel me dit l'erreur se produit. Cela me rend confus car aucun des arguments que je passe dans la fonction ne sont des pointeurs. Des idées?Accédez à l'emplacement de lecture de violation 0x00000000 malgré aucun pointeur

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 est déclarée comme un entier de pointeur non

Et si elle aide à tous, le débogueur me amène à une source qui ne sont pas disponibles, et donc le débogueur points au lieu de cette ligne dans le démontage Je ne connais pas l'assemblage, donc je ne suis pas sûr que ce soit même de toute aide.

EDIT

Au cas où quelqu'un se demandait, je lient le tampon de matrice d'éléments nécessaires à l'utilisation Vaos. Le reste de la classe Mesh est inférieure à

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

qu'il existe des pointeurs. 'this' est un pointeur,' shader' est un pointeur, le dernier argument de 'glVertexAttribPointer' est un pointeur (que vous avez mis à zéro ....) –

+0

Sont ** m_vao ** et d'autres variables utilisées ici toutes globales ? –

+0

[Comme mentionné dans cette question] (http://stackoverflow.com/q/23026612/1287251) (et autres), vous avez lié un tampon invalide qui n'est accessible qu'une fois que 'glDrawElements' est appelé. Vous devriez tester tous vos appels aux fonctions OpenGL pour voir si l'un d'eux échoue. Il est possible que l'un d'entre eux ait échoué, donc vous n'avez pas de tampon valide mais vous essayez quand même de procéder au rendu. – Cornstalks

Répondre

1

Les deux autres réponses ici ne sont que partiellement correcte. glDrawElements s'attend à ce que le dernier paramètre soit un pointeur vers certains index. Cependant, contrairement à ce que d'autres réponses suggèrent, il est correct si ce paramètre est 0 (NULL) parce que:

le paramètre indices de glDrawElements [...] est interprété comme un décalage dans l'objet tampon mesurée dans la machine de base unités.

si vous appelez glBindBuffer avec GL_ELEMENT_ARRAY_BUFFER.

Si c'est ce que vous essayez, le segfault signifie qu'un appel précédent à une fonction OpenGL a échoué et que vous n'avez pas lié un tampon valide. Lorsque vous appelez le glDrawElements, il ne dispose pas d'un tampon valide pour travailler avec, donc il segfaults. Check every OpenGL function call for success pour trouver lequel a échoué.

+0

Il est plus probable que l'OP n'ait pas lié un buffer de tableau d'éléments à l'échec d'un 'glBindBuffer'. Les objets Vertex Array (VAO) sont conçus comme un conteneur pour toutes les données relatives aux sommets: les objets Vertex Buffers (VBO) et les tableaux d'éléments, de sorte que vous pouvez faire un seul appel de liaison et mettre à jour toutes les liaisons. – radical7

+0

Je ne connaissais pas auparavant glGetError, donc je vais marquer cela comme la bonne réponse, seule différence était la fonction que vous pensiez causerait mes problèmes. La cause réelle, il s'est avéré que j'avais mis par erreur 'GL_FALSE' dans le troisième paramètre de' glVertexAttribPointer' au lieu de 'GL_FLOAT' comme il était censé être. – BossLetsPlays

-1

Le dernier argument, selon this, est un « un pointeur vers l'endroit où les indices sont stockés. »

Vous avez un 0. Donc, il essaie de l'emplacement de déréférencement 0.

+0

L'instruction sur un pointeur que vous référencez n'est valide que lorsque OpenGL utilise des tableaux de vertex côté client. Le code OP utilise un tableau de vertex côté serveur (spécifié par l'appel de 'glBindVertexArray'), ce qui change la signification du dernier paramètre en un décalage dans le tampon de tableau d'éléments liés, et non un pointeur. – radical7