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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

28.09.2013, 19:34

VBO in OpenGL

Guten Abend Community,

ich habe da mal eine Frage zu den VBO's in OpenGL. Ist es normal das sich die Anzahl der VBO's im Speicher, bei jedem Renderdurchlauf erhöhen und so immer mehr speicher fressen? Ich hatte eigentlich ein anderes Problem und bin dabei über den gDEBugger gestolpert. Nach dem ich ein wenig mit ihm herum gespielt habe ist mir aufgefallen das sich mit jedem Renderdurchlauf die Anzahl der VBO's ansteigt. Von ursprünglich 5 auf mehr als 1.000 am Ende. ist das Normal?

Danke für eure Antworten

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Volker_Neff« (28.09.2013, 20:41)


FSA

Community-Fossil

  • Private Nachricht senden

2

28.09.2013, 20:16

Ich wüsste nicht, warum das normal sein sollte. Es heißt übrigens VBO.
Erstellst du jeden Frame einen neuen VBO?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

28.09.2013, 20:42

Ja ich glaube, oder zwei? Müsste ich nachgucken ist auf jedenfall regelmässig.

FSA

Community-Fossil

  • Private Nachricht senden

4

28.09.2013, 20:49

Warum?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

5

28.09.2013, 22:31

Das ist grade die Frage,
heir noch einmal ein bischen Code:
Das erstellen eines VOB mit Textur und Model

C-/C++-Quelltext

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
bool ModelClass::InitializeTextureBuffers(OpenGLClass* OpenGL)
{
    VertexType* vertices;
    unsigned int* indices;
    int i;

    m_vertexCount = this->vertices.size();
    m_indexCount = this->vertices.size();

    // Create the vertex array.
    vertices = new VertexType[m_vertexCount];
    if(!vertices)
    {
        return false;
    }

    // Create the index array.
    indices = new unsigned int[m_indexCount];
    if(!indices)
    {
        return false;
    }

    // Load the vertex array and index array with data.
    for(i=0; i<m_vertexCount; i++)
    {
        vertices[i].x  = m_model[i].x;
        vertices[i].y  = m_model[i].y;
        vertices[i].z  = m_model[i].z;
        vertices[i].tu = m_model[i].tu;
        vertices[i].tv = 1.0f - m_model[i].tv;
        vertices[i].nx = m_model[i].nx;
        vertices[i].ny = m_model[i].ny;
        vertices[i].nz = m_model[i].nz;

        indices[i] = i;
    }

    // Allocate an OpenGL vertex array object.
    OpenGL->glGenVertexArrays(1, &m_vertexArrayId);

    // Bind the vertex array object to store all the buffers and vertex attributes we create here.
    OpenGL->glBindVertexArray(m_vertexArrayId);

    // Generate an ID for the vertex buffer.
    OpenGL->glGenBuffers(1, &m_vertexBufferId);

    // Bind the vertex buffer and load the vertex (position, texture, and normal) data into the vertex buffer.
    OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId);
    OpenGL->glBufferData(GL_ARRAY_BUFFER, m_vertexCount * sizeof(VertexType), vertices, GL_STATIC_DRAW);

    // Enable the three vertex array attributes.
    OpenGL->glEnableVertexAttribArray(0);  // Vertex position.
    OpenGL->glEnableVertexAttribArray(1);  // Texture coordinates.
    OpenGL->glEnableVertexAttribArray(2);  // Normals.

    // Specify the location and format of the position portion of the vertex buffer.
    OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId);
    OpenGL->glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(VertexType), 0);

    // Specify the location and format of the texture coordinate portion of the vertex buffer.
    OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId);
    OpenGL->glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(VertexType), (unsigned char*)NULL + (3 * sizeof(float)));

    // Specify the location and format of the normal vector portion of the vertex buffer.
    OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId);
    OpenGL->glVertexAttribPointer(2, 3, GL_FLOAT, false, sizeof(VertexType), (unsigned char*)NULL + (5 * sizeof(float)));

    // Generate an ID for the index buffer.
    OpenGL->glGenBuffers(1, &m_indexBufferId);

    // Bind the index buffer and load the index data into it.
    OpenGL->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferId);
    OpenGL->glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indexCount* sizeof(unsigned int), indices, GL_STATIC_DRAW);
    
    // Now that the buffers have been loaded we can release the array data.
    delete [] vertices;
    vertices = 0;

    delete [] indices;
    indices = 0;

    return true;
}

Und das Rendern

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void ModelClass::RenderBuffers(OpenGLClass* OpenGL)
{
    // Bind the vertex array object that stored all the information about the vertex and index buffers.
    OpenGL->glBindVertexArray(m_vertexArrayId);

    // Render the vertex buffer using the index buffer.
    glDrawElements(GL_TRIANGLES, m_indexCount, GL_UNSIGNED_INT, 0);


    return;
}


Mache ich einen sehr ungünstigen Fehler?

6

28.09.2013, 23:06

Copy und Paste dir keine Codes aus Tutorials zusammen, nur weil du das gern drin haben möchtest. Lern es, spiele mit herum und füge es dann ein.
Bringt dir überhaupt nichts gutes, vielleicht ein paar Schein-Glückshormone aber das wars auch an Positivem. Es ist einfahc kontraproduktiv für's Verständnis und irgendwann landest du damit auf einer Sandbank. Ich habe diese These wegen deiner extremen Kommentarflut, die du, wenn meine These nicht stimmt, versuchen solltest einzudämmen. Kommentare sollten so sparsam benutzt werden, wie Zitate. Code sollte sich überwiegend von selbst erklären, wenn man den jedoch zu einem Großteil nicht verstanden hat, ist das natürlich... ungünstig
Das nur als Randbemerkung.

MfG
Check

7

28.09.2013, 23:21

Also VBO´s erzeugst du einmal, dann existieren diese so lange bis du sie mit dem entsprechenden Befehl löschst. Wenn du den Inhalt des VBO nicht ändern möchtest gibst du dem glBufferData-Befehl etwas wie GL_STATIC_DRAW mit, wenn du den Inhalt jeden Frame ändern willst nimmst du etwas wie GL_DYNAMIC_DRAW oder GL_STREAM_DRAW. Du erzeugst dein VBO ganz am Anfang und löschst es ganz am Ende. Dazwischen kannst du es einfach benutzen. Also nein, dass jeden Frame neue VBOs angelegt werden, für ein und den selben Inhalt ist nicht normal ;).

Liebe Grüße,
~ EuadeLuxe ~

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

29.09.2013, 11:38

Du kannst dir mal meine VBO Klasse ansehen. Aber bitte nicht kopieren nur verstehen!

Genutzt wird sie dann mit einem vector und zwar so (erzeugt einen Buffer mit 2D vertices):

C-/C++-Quelltext

1
2
3
std::vector<bb::vertex2> vb = {bb::vertex2(), bb::vertex2(1.0f, 0.0f), bb::vertex2(1.0f, 1.0f), bb::vertex2(0.0f, 1.0f)};
bb::VBO<bb::vertex2>* vertexBuffer = new bb::VBO<bb::vertex2>(vertexName, GL_ARRAY_BUFFER);
vertexBuffer->fill(vb, vb.size()*sizeof(bb::vertex2), GL_STATIC_DRAW);

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

9

29.09.2013, 15:27

Danke für eure Antworten.

@DeKugelschreiber: Danke für deine Klasse. Ich werde probieren sie zu verstehen und mit meiner Herangehensweise zu vergleich.
@EuadeLuxe: Vielen Dank. Ich werde mal gucken wie häufig ich diese Funktion Aufrufe, sind wohl doch mehr als nötig.
@Checkmateing: Es stimmt das ist aus einem Tut kopiert, und es ist ungünstig es (noch) nicht verstanden zu haben. Doch irgendwo muss man ja anfangen.

Gibt es zur Aktuellen OpenGL Version, am besten mit C++, ein gutes Buch oder Tutorial?

Danke schon einmal im Voraus

10

29.09.2013, 17:55

Ich würde mal spontan das hier empfehlen: http://www.opengl-tutorial.org/, dazu noch das hier: http://www.lighthouse3d.com/ und die OpenGL Referenz: http://www.opengl.org/sdk/docs/man/

Viele Grüße,
~ EuadeLuxe ~

Werbeanzeige