Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

1

11.08.2007, 23:56

OpenGL Index Buffers?

Hallo.

Meine Frage ist, wie kann man in OpenGL Index-Buffers verwenden?
Mittlerweile funktionieren die VBO's aber ich finde im Internet so gut wie keine Informationen zu Index-Buffers in OpenGL lediglich dass hier: http://www.blitzbasic.com/Community/posts.php?topic=47065. Aber dieses Beispiel kapier ich irgendwie nicht. Was soll ein glColorPointer mit einem Index-Buffer zu tun haben?

Hoffe jemand von euch kann mir weiterhelfen!

mfg Philipp

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

2

12.08.2007, 00:40

mit glVertexPointer() gibts du die vertices an, und funktionen wie glDrawArray()/glDrawElements() nehmen indieces entgegen
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

3

12.08.2007, 02:22

Also wenn ich dass jetzt richtig verstehe:
anstatt ca dem

C-/C++-Quelltext

1
2
3
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_->getGlBufferId());
    glVertexPointer(3, GL_FLOAT, 0, NULL);
    glDrawArrays(static_cast<GLenum>(glPrimitiveType_), 0, vertexBuffer_->getVertexCount());


mache ich jetzt einfach ca, folgendes:

C-/C++-Quelltext

1
2
3
4
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_->getGlBufferId());
    glVertexPointer(3, GL_FLOAT, 0, NULL);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer_->getGlBufferId());
    glDrawElements(GL_TRIANGLES, indexBuffer_->getIndexCount() / 3, GL_UNSIGNED_SHORT, indexBuffer_->getIndices())

mfg Philipp

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

4

12.08.2007, 11:29

da fehlt noch ein aufruf von glBufferData(), wo du die indicies angeben musst.
dann gibts du bei glDrawElements() nur noch den offset an.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

5

12.08.2007, 12:38

glBufferData brauche ich doch nur, wenn ich die Puffer erzeuge oder?
Also ich rufe es in den setData Methoden meiner Index- und VertexBuffer Klasse auf. Das müsste doch reichen?

Bitte um Korrektur falls dem nicht so ist!

mfg Philipp

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

6

12.08.2007, 13:03

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GLfloat vertices[][3] = { /* ... */ };
GLubyte indices[][3] = { /* ... */ };
GLuint myBuffer[2];

glGenBuffers(2, myBuffer);
glBindBuffer(GL_ARRAY_BUFFER, myBuffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,
                   GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 
                       NULL); // offset vertex

glEnableClientState(GL_VERTEX_ARRAY);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, myBuffer[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,
                   GL_STATIC_DRAW);

glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE,
                        NULL); // offset index


sollte so funktionieren
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

7

21.08.2007, 14:11

So.
Mittlerweile habe ich die Applikation mit Indexpuffern zum Laufen bekommen.
Aber nun stehe ich auch schon wieder vor dem nächsten Problem.
Ich verwende nicht die bisher üblichen Standardprimitiven, sondern Adjazenzdreiecke (GL_TRIANGLES_ADJACENCY_EXT).
Sobald ich jedoch diesen Primitventyp verwende, bleibt der Bildschirm leer und ich hab irgendwie keine Ahnung, wie ich herausfinden soll, was da schiefgeht.
Nach stundenlangem Debuggen bin ich mir zumindest sicher, dass die Daten aus Vertex und Indexpuffer korrekt sind.

Darstellen will ich das mesh mittels folgendem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_->getGlBufferId());
    glVertexPointer(3, GL_FLOAT, 0, NULL);
    glBindBuffer(GL_ARRAY_BUFFER, normalBuffer_->getGlBufferId());
    glNormalPointer(GL_FLOAT, 0, NULL);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer_->getGlBufferId());
    glDrawElements(glPrimitiveType_, indexBuffer_->getFaceCount() * Face::VERTEX_COUNT * 3, 
      GL_UNSIGNED_SHORT, NULL); //glPrimitiveType_ = GL_TRIANGLES_ADJACENCY_EXT


Doch wie gesagt bleibt alles leer.

Hat irgenjemand von euch eine Idee, was ich machen könnte um herauszufinden was da schief läuft, bzw. sonstige Tipps oder eine Lösung des Problems für mich?

mfg Philipp

sgaffga

Frischling

Beiträge: 6

Wohnort: Krefeld

  • Private Nachricht senden

8

21.08.2007, 16:06

Ich nehme an, dass du "glGetError()" schon abgefragt hast?

Grüße
Stefan

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

9

21.08.2007, 16:45

Nein.

Ich habe lediglich gDebugger verwendet, und laut dem treten keine Fehler auf, werde aber glGetError auch noch einmal versuchen.

Edit: glGetError sagt auch, dass kein Fehler aufgetreten ist

mfg Philipp

Werbeanzeige