A
OK, alles kaputt, Segfaultet nur so
hab jetzt ein Backup genommen - der Code sieht so aus:
Rendern
void ALSAGE_OGL::drawMesh(int Id,AL_Vector pos,AL_Vector scale, int TexId)
{
glScalef(scale.x,scale.y,scale.z);
glDisable(GL_LIGHTING);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
if(TexId != -1) glBindTexture(GL_TEXTURE_2D, textures[TexId].Name);
if(lastMesh != Id)
{
glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[2]);
glColorPointer(4, GL_UNSIGNED_BYTE, 0,0);
glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[3]);
glTexCoordPointer(2, GL_FLOAT, 0,0);
glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[4]);
glNormalPointer(GL_FLOAT, 0,0);
glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[0]);
glVertexPointer(3, GL_FLOAT, 0,0);
lastMesh = Id;
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,meshes[Id].VBO[1]);
glDrawRangeElements(GL_TRIANGLES, 0,meshes[Id].numTris*3-1,meshes[Id].numTris*3,
GL_UNSIGNED_INT,NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
laden:
int ALSAGE_OGL::loadMesh(AL_Char* filename)
{
AL_Mesh* mesh = new AL_Mesh;
AL_byte nBufs = 5;
mesh->loadFromFile(filename);
meshes[numMeshes].numVert = mesh->vertCount();
meshes[numMeshes].numTris = mesh->TrisCount();
glGenBuffers(nBufs, meshes[numMeshes].VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, meshes[numMeshes].VBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, meshes[numMeshes].numTris*sizeof(AL_Triangle),
mesh->getTrianglePointer(), GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, meshes[numMeshes].VBO[2]);
glBufferData(GL_ARRAY_BUFFER, meshes[numMeshes].numVert*sizeof(AL_VertCol),
mesh->getColorPointer(), GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, meshes[numMeshes].VBO[3]);
glBufferData(GL_ARRAY_BUFFER, meshes[numMeshes].numVert*sizeof(AL_VertTex),
mesh->getUVCoordPointer(), GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, meshes[numMeshes].VBO[4]);
glBufferData(GL_ARRAY_BUFFER, meshes[numMeshes].numVert*sizeof(AL_VertNor),
mesh->getNormalPointer(), GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, meshes[numMeshes].VBO[0]);
glBufferData(GL_ARRAY_BUFFER, meshes[numMeshes].numVert*sizeof(AL_VertCrd),
mesh->getCoordPointer(), GL_STREAM_DRAW);
numMeshes++;
delete mesh;
return numMeshes-1;
}
Und funktioniert bestens. Ich mache jetzt folgendes (Zeile 21-22 beim Laden):
glBufferData(GL_ARRAY_BUFFER,
meshes[numMeshes].numVert*sizeof(AL_VertTex),
0,
GL_STREAM_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,
0,
meshes[numMeshes].numVert*sizeof(AL_VertTex),
mesh->getUVCoordPointer());
Es funktioniert. Dann probiert ich das hier (Zeile 17-22 beim laden):
glBufferData(GL_ARRAY_BUFFER,
meshes[numMeshes].numVert*(sizeof(AL_VertCol)+sizeof(AL_VertTex)),
0,
GL_STREAM_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,
0,
meshes[numMeshes].numVert*sizeof(AL_VertCol),
mesh->getColorPointer());
/*glBindBuffer(GL_ARRAY_BUFFER, meshes[numMeshes].VBO[3]);
glBufferData(GL_ARRAY_BUFFER,
meshes[numMeshes].numVert*sizeof(AL_VertTex),
0,
GL_STREAM_DRAW);*/
glBufferSubData(GL_ARRAY_BUFFER,
meshes[numMeshes].numVert*sizeof(AL_VertCol),
meshes[numMeshes].numVert*sizeof(AL_VertTex),
mesh->getUVCoordPointer());
und dann beim Rendern (Zeile 13-17):
glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[2]);
glColorPointer(4, GL_UNSIGNED_BYTE, 0,0);
//glBindBuffer(GL_ARRAY_BUFFER,meshes[Id].VBO[3]);
glTexCoordPointer(2, GL_FLOAT, 0,
BUFFER_OFFSET(meshes[numMeshes].numVert*sizeof(AL_VertCol)));
Das Ergebnis:
http://b.imagehost.org/view/0899/bug.png
Die TexturCoordinaten sind absolut falsch. Was hab ich falsch gemacht?
[EDIT] Möchte noch hinzufügen, dass ich nach alldem anscheinend meine Grafikkarte leicht zerschossen habe denn ich hab soeben ein Game angemacht und plötlich sprang mein Pc in einen 800x600x16farben modus. Also der Treiber ist eindeutig abgestürzt. Ist OpenGL irgendwie schädlich?
[Edit2] lag daran dass ich beim Rendern numMeshes als index genommen hab, hätte Id nehmen sollen... Immer diese Konzentrationsfehler... Sind mir in der schule doch schon zu genüge ein problem