Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki

Aktuelle Zeit: Mo Aug 21, 2017 16:55

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [Gelöst] Crash bei glDrawElements
BeitragVerfasst: Sa Jul 22, 2017 09:37 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich bin auf ein merkwürdiges aber reproduzierbares Problem gestoßen in OpenGL 1.x (Kein VBO!), wenn ich glDrawElements mit aktivem glTexcoordPointer nutze, dann Crasht es direkt im Grafik-Treiber.
Bei mir auf mit GTX 970 sowie im Geschäft mit Quadro aufem Notebook crasht es Hard beim glDrawElements call :-(

Code:
  1.  
  2.  // Blending aktiv sowie eine gebundene Texture
  3.  
  4. GLsizei vertexStride = (GLsizei)header->vertexStride;
  5. glEnableClientState(GL_VERTEX_ARRAY);
  6. glVertexPointer(2, GL_FLOAT, vertexStride, header->vertices);
  7.  
  8. assert(header->texcoords != header->vertices);
  9. GLsizei texcoordStride = (GLsizei)header->texcoordStride;
  10. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  11. glVertexPointer(2, GL_FLOAT, texcoordStride, header->texcoords);
  12.  
  13. assert(header->colors != header->vertices);
  14. GLsizei colorStride = (GLsizei)header->colorStride;
  15. glEnableClientState(GL_COLOR_ARRAY);
  16. glColorPointer(4, GL_FLOAT, colorStride, header->colors);
  17.  
  18. size_t indexSize = vertexIndexArray->indexSize;
  19. GLenum type = indexSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
  20. glDrawElements(primitiveType, (GLsizei)vertexIndexArrayDraw->count, type, vertexIndexArray->indices);
  21.  
  22. glDisableClientState(GL_COLOR_ARRAY);
  23. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  24. glDisableClientState(GL_VERTEX_ARRAY);
  25.  


Der Fehler ist:
Exception thrown at 0x000000005C42F767 (nvoglv64.dll) in NBodySimulation.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

Habe mir den Speicher von den Daten die bei Vertex/Color/Texcoord Pointer gesetzt werden angeschaut und kein Fehler gesehen.
Tatsächlich ist auch so, wenn ich das DrawElements selbst mache, dann gehts einwandfrei somit sind die Daten in Ordnung:

Code:
  1.  
  2.   assert(vertexIndexArray->indices != nullptr);
  3. assert(vertexIndexArray->vertices != nullptr);
  4. assert(vertexIndexArray->texcoords != nullptr);
  5. assert(vertexIndexArray->colors != nullptr);
  6. assert(primitiveType == GL_TRIANGLES);
  7.  
  8. uint32_t triangleCount = vertexIndexArrayDraw->count / 3;
  9. for (uint32_t triangleIndex = 0; triangleIndex < triangleCount; ++triangleIndex) {
  10.     uint32_t index0 = *((uint32_t *)vertexIndexArray->indices + triangleIndex * 3 + 0);
  11.     uint32_t index1 = *((uint32_t *)vertexIndexArray->indices + triangleIndex * 3 + 1);
  12.     uint32_t index2 = *((uint32_t *)vertexIndexArray->indices + triangleIndex * 3 + 2);
  13.      
  14.     Vec2f v0 = *(Vec2f *)((uint8_t *)vertexIndexArray->vertices + vertexIndexArray->vertexStride * index0);
  15.     Vec2f v1 = *(Vec2f *)((uint8_t *)vertexIndexArray->vertices + vertexIndexArray->vertexStride * index1);
  16.     Vec2f v2 = *(Vec2f *)((uint8_t *)vertexIndexArray->vertices + vertexIndexArray->vertexStride * index2);
  17.      
  18.     Vec2f t0 = *(Vec2f *)((uint8_t *)vertexIndexArray->texcoords + vertexIndexArray->texcoordStride * index0);
  19.     Vec2f t1 = *(Vec2f *)((uint8_t *)vertexIndexArray->texcoords + vertexIndexArray->texcoordStride * index1);
  20.     Vec2f t2 = *(Vec2f *)((uint8_t *)vertexIndexArray->texcoords + vertexIndexArray->texcoordStride * index2);
  21.      
  22.     Vec4f c0 = *(Vec4f *)((uint8_t *)vertexIndexArray->colors + vertexIndexArray->colorStride * index0);
  23.     Vec4f c1 = *(Vec4f *)((uint8_t *)vertexIndexArray->colors + vertexIndexArray->colorStride * index1);
  24.     Vec4f c2 = *(Vec4f *)((uint8_t *)vertexIndexArray->colors + vertexIndexArray->colorStride * index2);
  25.      
  26.     glBegin(primitiveType);
  27.         glColor4fv(&c0.m[0]);
  28.         glTexCoord2fv(&t0.m[0]);
  29.         glVertex2fv(&v0.m[0]);
  30.         glColor4fv(&c1.m[0]);
  31.         glTexCoord2fv(&t1.m[0]);
  32.         glVertex2fv(&v1.m[0]);
  33.         glColor4fv(&c2.m[0]);
  34.         glTexCoord2fv(&t2.m[0]);
  35.         glVertex2fv(&v2.m[0]);
  36.     glEnd();
  37. }
  38.  


Live ausprobieren könnt ihr es direkt in meinem aktuellen Projekt:

https://github.com/f1nalspace/nbodysimu ... n.cpp#L420

Kann mir jemand sagen, was ich falsch gemacht habe?


Zuletzt geändert von Finalspace am Sa Jul 22, 2017 11:04, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jul 22, 2017 11:03 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tja manchmal muss man einfach nen Tag warten und drüben nachdenken.

Ich Held habe glVertexPointer anstatt glTexCoordPointer für GL_TEXTURE_COORD_ARRAY verwendet -.-

Problem gelöst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jul 22, 2017 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1046
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Tja manchmal muss man einfach nen Tag warten und drüben nachdenken.

Das hat bei mir auch schon sehr viel gebracht. da kann man hundert mal über den Fehler gucken un man sieht ihn nicht,

Zitat:
Ich Held habe glVertexPointer anstatt glTexCoordPointer für GL_TEXTURE_COORD_ARRAY verwendet -.-

Das sowas mit einer Schutzverletzung quittiert wird. :roll:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.027s | 17 Queries | GZIP : On ]