EXC_BAD_ACCESS sur un glDrawRangeElements
Bonjour,
je suis en train de me battre avec OpenGL et je ne trouve pas de solution.
je travail sur l'affichage de la scene avec l'aide des VBO. A chaque tentative, j'obtien un joli:
Citation:
Nom du signal :
EXC_BAD_ACCESS
Signification du signal :
Could not access memory
voila mon code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
//ma structure de donnée
GLuint m_VertexBuffer;
SVertex* m_VertexBufferContent;
bool m_IsLocked;
bool m_IsEnable;
// identifiant de l'indexbuffer
GLuint m_IndexBuffer;
ushort* m_IndexBufferContent;
int m_Numvertex;
int m_NumIndex; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
//Definition de mon modele:
this->aMesh = new projet::models::CModelsMesh();
SVertex aVertex;
aVertex.nx=0;
aVertex.ny=0;
aVertex.nz=0;
aVertex.s0=0;
aVertex.t0=0;
aVertex.x=0;
aVertex.y=0;
aVertex.z=0;
this->aMesh->addVertex(aVertex);
aVertex.nx=0;
aVertex.ny=0;
aVertex.nz=0;
aVertex.s0=0;
aVertex.t0=0;
aVertex.x=1;
aVertex.y=0;
aVertex.z=0;
this->aMesh->addVertex(aVertex);
aVertex.nx=0;
aVertex.ny=0;
aVertex.nz=0;
aVertex.s0=0;
aVertex.t0=0;
aVertex.x=1;
aVertex.y=1;
aVertex.z=0;
this->aMesh->addVertex(aVertex);
aVertex.nx=0;
aVertex.ny=0;
aVertex.nz=0;
aVertex.s0=0;
aVertex.t0=0;
aVertex.x=0;
aVertex.y=1;
aVertex.z=0;
this->aMesh->addVertex(aVertex);
this->aMesh->addIndex((ushort)0);
this->aMesh->addIndex((ushort)2);
this->aMesh->addIndex((ushort)3);
this->aMesh->addIndex((ushort)0);
this->aMesh->addIndex((ushort)1);
this->aMesh->addIndex((ushort)2);
this->aMesh->updateIndexBuffer();
this->aMesh->updateVertexBuffer(); |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
// la creation des buffers
void CModelsMesh::updateIndexBuffer()
{
this->m_NumIndex = this->m_IndexBufferVector.size();
this->m_IndexBufferContent = new ushort[this->m_NumIndex];
for(int i=0;i< this->m_NumIndex;i++)
{
this->m_IndexBufferContent[i]=this->m_IndexBufferVector[i];
std::cout << this->m_IndexBufferContent[i] << std::endl;
}
glGenBuffers(1, &this->m_IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ushort) * this->m_NumIndex,
this->m_IndexBufferContent, GL_STATIC_DRAW);
//return this->m_IndexBuffer;
}
void CModelsMesh::updateVertexBuffer()
{
this->m_Numvertex = this->m_VertexBufferVector.size();
this->m_VertexBufferContent = new SVertex[this->m_Numvertex];
for(int i=0;i< this->m_Numvertex;i++)
{
this->m_VertexBufferContent[i]=this->m_VertexBufferVector[i];
}
glGenBuffers(1, &this->m_VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, this->m_VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(SVertex) * this->m_Numvertex,
&this->m_VertexBufferContent[0].x, GL_STATIC_DRAW);
//return this->m_VertexBuffer;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
//et l'affichage
glBindBuffer(GL_ARRAY_BUFFER, aMeshPart->getParent()->getVertexBuffer());
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(0)); //The starting point of the VBO, for the vertices
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(12)); //The starting point of normals, 12 bytes away
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(24)); //The starting point of texcoords, 24 bytes away
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, aMeshPart->getParent()->getIndexBuffer());
glDrawRangeElements(GL_TRIANGLES, 0, 3, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); //The starting point of the IBO |
cela va faire pret de 3jours que je toruture mon cerveau mais je ne trouve rien ni sur internet ni dans la doc... avez vous une idée?
merci beaucoup d'avance
T.