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

Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

11

30.09.2013, 13:55

hab ganz gute Erfahrungen mit der Superbible gemacht

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

12

03.10.2013, 20:44

Danke für die Tipps,
ich habe mich mal ein wenig eingelesen und bin jetzt mal der Meinung, dass ganze wenigstens ein bisschen verstanden zu habe. Ich habe mit diesem Tutorial gearbeitet, fand das immer sehr verständlich.
Jetzt aber noch einmal zu meinem Problem. Das sich die VBO's nicht ins unendliche vermehren. Leider sehe ich meinen Text den ich sehen möchte immer noch nicht. Ich würde mich sehr freuen wenn noch einmal jemand über meinen Code guckt und mir vielciht sagenkann was ich falsch mache.
Ich erstelle eine neue Instanz meiner TextClass dann wird aus den eingelesenen Daten und dem übergebenen Text ein zweidimensionales Modell erechnet.

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
bool TextClass::CreateText ()
{
    //local
    float width = 0;
    Windowsize* wz = Input->GetWindowsize ();

    for (unsigned int i = 0; i < Text.size(); i++)
    {
        char Symbol;
        TextModel* Model;

        Symbol = Text[i];
        for (unsigned int z = 0; z < TextUVdata.size(); z++)
        {
            if (Symbol == TextUVdata[z]->symbol)
            {
                Model = new TextModel;
                Model->Symbol = Symbol;

                //Triangle 1 Point 1
                Model->x[0] = width;
                Model->y[0] = this->PosY + TextUVdata[z]->h * wz->Pixel_in_float_height;
                Model->z[0] = this->PosZ;
                Model->u[0] = TextUVdata[z]->x;
                Model->v[0] = TextUVdata[z]->y + TextUVdata[z]->h;
                //Triangle 1 Point 2
                Model->x[1] = width;
                Model->y[1] = this->PosY;
                Model->z[1] = this->PosZ;
                Model->u[1] = TextUVdata[z]->x;
                Model->v[1] = TextUVdata[z]->y;
                //Triangle 1 Point 3
                Model->x[2] = width + TextUVdata[z]->w * wz->Pixel_in_float_width;
                Model->y[2] = this->PosY;
                Model->z[2] = this->PosZ;
                Model->u[2] = TextUVdata[z]->x + TextUVdata[z]->w;
                Model->v[2] = TextUVdata[z]->y;
                //Triangle 2 Point 1
                Model->x[3] = width + TextUVdata[z]->w * wz->Pixel_in_float_width;
                Model->y[3] = this->PosY;
                Model->z[3] = this->PosZ;
                Model->u[3] = TextUVdata[z]->x + TextUVdata[z]->w;
                Model->v[3] = TextUVdata[z]->y;
                //Triangle 2 Point 2
                Model->x[4] = width + TextUVdata[z]->w * wz->Pixel_in_float_width;
                Model->y[4] = this->PosY + TextUVdata[z]->h * wz->Pixel_in_float_height;
                Model->z[4] = this->PosZ;
                Model->u[4] = TextUVdata[z]->x + TextUVdata[z]->w;
                Model->v[4] = TextUVdata[z]->y + TextUVdata[z]->h;
                //Triangle 2 Point 3
                Model->x[5] = width;
                Model->y[5] = this->PosY + TextUVdata[z]->h * wz->Pixel_in_float_height;
                Model->z[5] = this->PosZ;
                Model->u[5] = TextUVdata[z]->x;
                Model->v[5] = TextUVdata[z]->y + TextUVdata[z]->h;
            }
        }
        Textmodel.push_back(Model);
    }
    return true;
}

Dannach werden die Daten noch einmal in Vertices aufgeteielt und dann in eine VAO gepackt.

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
85
86
87
88
89
90
91
bool TextClass::CreateBuffer ()
{
    VertexType* vertices;
    unsigned int* indices;
    int i;

    int m_vertexCount = this->Textmodel.size () *6;
    this->m_indexCount = this->Textmodel.size () *6;

    // 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.
    int c = 0;
    int t = 0;
    while (c < this->Textmodel.size ())
    {
        for (int z = 0; z < 6; z++)
        {
            vertices[c].x  = Textmodel[t]->x[z];
            vertices[c].y  = Textmodel[t]->y[z];
            vertices[c].z  = Textmodel[t]->z[z];
            vertices[c].tu = Textmodel[t]->u[z];
            vertices[c].tv = Textmodel[t]->u[z];
            vertices[c].nx = 0;
            vertices[c].ny = 1;
            vertices[c].nz = 0;

            indices[c] = c;
        }
        t = t + 1;
        c = c + 1;
    }

    // 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 noch eine Frage zum schluss, gibt es eine beim gDEBugger sich einen bestimmtes VBO gerendert aus zu geben?

Danke für eure Hilfe

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

13

03.10.2013, 20:52

Es wird wohl nicht an den hier gezeigten Stellen liegen, sondern eher an den Stellen an denen du die Methoden aufrufst. Wenn du das in deinem main loop machst ist das natürlich eher schlecht ;)
Übrigens brauchst du beim erstellen der Buffer kein glEnableVertexAttribArray, das ist für die Shader...

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

14

03.10.2013, 21:52

Danke für deine Schnelle Antwort. Ich rufe zu erst mehrere Update Funktionen auf und Rendere dann aus einer einzigen, ober geordneten, Funktion alles heraus. Gibt noch etwas auf das ich bestimmt achten muss? Oder ist es besser wenn ich Update und Rendering immer im wechsel habe?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

15

03.10.2013, 22:58

Werden die Update Funktionen pro Frame aufgerufen und erstellst du darin neue Buffer mit den obrigen Methoden?
Normalerweise erstellt man alle Buffer die man (sofort) benötigt vor dem ersten Rendern, also in einer load() Funktion oder sowas.
Du solltest darauf achten nicht jedes mal glGenBuffers aufzurufen, aber wie gesagt aus dem Stück Code geht das nicht hervor.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

16

04.10.2013, 12:47

Nein im Momment erstellle ich die Buffer vor dem ersten rendern in der Update Funktion und danach lasse ich sie immer nur noch rendern.
Dann werde ich wohl noch einmal weiter suchen, aber schon einmal viellen dacnk

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Volker_Neff« (07.10.2013, 13:53)


Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

17

09.10.2013, 10:56

Ich habe mich in den letzten Tagen weiter mit meinem Problem beschäftigt und so einige spannende sachen heraus gefunden die ich mir noch nicht so ganz erklären kann. Als aller erstes habe ich das erzeugen der Vertex so weit vereinfacht als das ich jetzt Quadrate Rendere und so statt sech nur noch vier Punkte definieren muss.

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
if (Symbol == TextUVdata[z]->symbol)
            {
                Model = new TextModel;
                Model->Symbol = Symbol;

                //Point 1
                Model->x[0] = width;
                Model->y[0] = this->PosY;
                Model->z[0] = this->PosZ + TextUVdata[z]->hight * wz->Pixel_in_float_height;
                Model->u[0] = TextUVdata[z]->x;
                Model->v[0] = TextUVdata[z]->y + TextUVdata[z]->h;
                //Point 2
                Model->x[1] = width;
                Model->y[1] = this->PosY;
                Model->z[1] = this->PosZ;
                Model->u[1] = TextUVdata[z]->x;
                Model->v[1] = TextUVdata[z]->y;
                //Point 3
                Model->x[2] = width + TextUVdata[z]->width * wz->Pixel_in_float_width;
                Model->y[2] = this->PosY;
                Model->z[2] = this->PosZ;
                Model->u[2] = TextUVdata[z]->x + TextUVdata[z]->w;
                Model->v[2] = TextUVdata[z]->y;
                //Point 4
                Model->x[3] = width + TextUVdata[z]->width * wz->Pixel_in_float_width;
                Model->y[3] = this->PosY;
                Model->z[3] = this->PosZ + TextUVdata[z]->hight * wz->Pixel_in_float_height;
                Model->u[3] = TextUVdata[z]->x + TextUVdata[z]->w;
                Model->v[3] = TextUVdata[z]->y + TextUVdata[z]->h;
                

                //Set new width
                width = width + TextUVdata[z]->width * wz->Pixel_in_float_height;

Dann haben ich noch ein fehler in meiner Schleife behoben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while (c < this->Textmodel.size ())
    {
        for (int z = 0; z < 4; z++)
        {
            vertices[t].x  = Textmodel[c]->x[z];
            vertices[t].y  = Textmodel[c]->y[z];
            vertices[t].z  = Textmodel[c]->z[z];
            vertices[t].tu = Textmodel[c]->u[z];
            vertices[t].tv = Textmodel[c]->u[z];
            vertices[t].nx = 0;
            vertices[t].ny = 1;
            vertices[t].nz = 0;

            indices[t] = t;
            t = t + 1;
        }
        c = c + 1;
    }

Ich habe zu testzwecken einmal nur einen Buchstaben, ein 'H', an die Funktionen über geben und wollte es rendern. Beim Auswerten des Textes und erstellen der Vertexe sind dies Werte für den Buchstaben 'H' heraus gekommen.
Für den Punkt unten Links:
X: 0.0000
Y: 5.0000
Z: 0.1744
U: 0.7050
V: 0.7207
Für den Punkt oben Links:
X: 0.0000
Y: 5.0000
Z: 0.0000
U: 0.7050
V: 0.2949
Für den Punkt oben Rechts:
X: 0.0512
Y: 5.0000
Z: 0.0000
U: 1,4785
V: 0.2949
Für den Punkt unten Rechts:
X: 0.0512
Y: 5.0000
Z: 0.1744
U: 1,4785
V: 0.7207
Am Ende kommen aber komische Ergebnisse beim Buffer an. Ich habe sie mir den Index und Vertex Buffer ausgeben lassen und ihn gespeichert. im anhang sind sie, leider ist das *.csv Format geblockt, ich habe ich sie als *.txt Darteien Hochgeladen.
Ich verstehe nicht ganz warum sich die Buffer so von den von mir generierten Vertexen unterscheiden, ist das normal?
»Volker_Neff« hat folgendes Bild angehängt:
  • OpenGLContext2-Static-FrontBuffer.png
»Volker_Neff« hat folgende Dateien angehängt:

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Volker_Neff« (09.10.2013, 23:39)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

18

09.10.2013, 15:15

Geht es jetzt darum das der Text nicht zu sehen ist?
Und geht es hier überhaupt um textured fonts?

Irgendwie verstehe ich nicht so ganz was du machen möchtest. Wenn du keine Ausgabe bekommt kannst du z.B. schon mal die Shader vereinfachen (nur weiß ausgeben z.B.) und gucken ob dann "irgendwas" sichtbar ist. Für die Koordinaten und UVs die du z.Z. berechnest erstmal feste Werte eingeben.
Ansonsten musst du orthogonal rendern (für 2D).

Falls es dich interessiert wie ich ein Mesh für Text erstelle (inkl. UVs):

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
85
86
void Text::setText(const std::string &text){
    Font* font = static_cast<Font*>(getComponent("Font"));
    Sprite* sprite = static_cast<Sprite*>(getComponent("Sprite"));

    if(font && sprite){
        m_text = text;

        // generate buffer
        std::vector<unsigned int> indices;
        std::vector<vec2> vertices;
        std::vector<vec2> texCoords;

        indices.resize(m_text.length()*6);
        vertices.resize(m_text.length()*4);
        texCoords.resize(m_text.length()*4);

        vec2 offset = vec2();
        Font::character c;
        unsigned int index = 0;

        for(unsigned int i = 0; i < m_text.length()*6; i += 6){
            // indices
            indices[i] = index;
            indices[i+1] = index+1;
            indices[i+2] = index+2;
            indices[i+3] = index;
            indices[i+4] = index+2;
            indices[i+5] = index+3;

            index += 4;
        }

        index = 0;

        for(unsigned int i = 0; i < m_text.length()*4; i += 4){
            // special characters
            if(m_text.at(index) == ' '){ // space
                offset.x += font->m_spaceBar+font->m_space.x;
                index++;

                continue;
            }
            else if(m_text.at(index) == '\t'){ // tab
                offset.x += font->m_tab+font->m_space.x;
                index++;

                continue;
            }
            else if(m_text.at(index) == '\n'){ // new line
                offset.y -= 1.0f+font->m_space.y;
                offset.x = 0.0f;
                index++;

                continue;
            }

            c = font->getCharacter(m_text.at(index));

            // vertices
            vertices[i] = vec2(offset.x, offset.y);
            vertices[i+1] = vec2(offset.x+c.size.x, offset.y);
            vertices[i+2] = vec2(offset.x+c.size.x, offset.y+c.size.y);
            vertices[i+3] = vec2(offset.x, offset.y+c.size.y);

            // texture coordinates
            texCoords[i] = vec2(c.min.x, c.min.y);
            texCoords[i+1] = vec2(c.max.x, c.min.y);
            texCoords[i+2] = vec2(c.max.x, c.max.y);
            texCoords[i+3] = vec2(c.min.x, c.max.y);

            offset.x += c.size.x+font->m_space.x;
            index++;
        }

        VBO<unsigned int>* indexBuffer = new VBO<unsigned int>("index0", GL_ELEMENT_ARRAY_BUFFER);
        indexBuffer->fill(indices, indices.size()*sizeof(unsigned int), GL_STATIC_DRAW);

        VBO<vec2>* vertexBuffer = new VBO<vec2>("vertex0", GL_ARRAY_BUFFER);
        vertexBuffer->fill(vertices, vertices.size()*sizeof(vec2), GL_STATIC_DRAW);

        VBO<vec2>* texCoordBuffer = new VBO<vec2>("texCoord0", GL_ARRAY_BUFFER);
        texCoordBuffer->fill(texCoords, texCoords.size()*sizeof(vec2), GL_STATIC_DRAW);

        sprite->m_mesh->generateMesh(indexBuffer, vertexBuffer, texCoordBuffer); // drops
    }
}


Die Koordinaten für die UVs werden in meiner "Font" Klasse angegeben (unten links dann z.B. 0|0, einer rechts daneben 1|0). Alle Membervariablen sind nur irgendwelche Abstände (als floats).

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

19

09.10.2013, 23:43

Danke für dein Klasse, das war nicht das Problem, glaube ich auf jeden Fall, leider gab es irgend ein Problem und es wurde nur die hälfte meines Textes abgesendet. Ich habe ihn verbessert und nun hoffe ich ist auch das Problem deutlich geworden. Ich kann nicht verstehen warum bei den Buffer so andere Werte heraus kommen.
Danke noch einmal für eure Hilfe

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

20

10.10.2013, 00:28

Sowas hier: 1,4785 kann als UV Koordinate schon mal gar nicht sein.
Die sollten zwischen 0 und 1 liegen...
Ansonsten kenne ich mich mit dem Debugger nicht aus, aber so spontan sieht das doch normal aus?

Willst du denn Text rendern? Habe ich das richtig verstanden?

Werbeanzeige