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

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

10.09.2011, 17:10

VBO + Textur Koordinaten?

Ich bin relativ neu was OpenGL angeht und wollte daher grundsätzlich Fragen: ist es möglich mittels Vertex Buffer Objects außer den normalen Vertex Koordinaten auch zugehörige Textur Koordinaten zu speichern, so dass so etwas wie eine TileMap möglich wäre? Oder brauche ich dafür gezwungenermaßen Shader? Bin wie gesagt absoluter Frischling in OpenGL ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.09.2011, 17:13

Klar ist das möglich. glTexCoordPointer() und fertig ;)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

10.09.2011, 17:19

Das wäre legitim? Kein extra Transport in den Vertex Buffer oder gar zusätzlichen Buffer? Gleich mal probieren. Danke dot, diesmal sogar ohne 3 Punkte ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.09.2011, 17:31

Kein extra Transport in den Vertex Buffer oder gar zusätzlichen Buffer?

Bin mir nicht ganz sicher was du damit meinst. Prinzipiell hast du in OGL die Wahl, ob du deine Daten interleaved ablegst (also z.B. im selben Buffer für jeden Vertex erst Position und dann Texcoords) oder separate Buffer (z.B. einen für Position und einen für Texcoords) verwendest oder was auch immer sonst dir so einfallen mag. Über Offset und Stride bei gl*Pointer() lässt sich das beliebig regeln.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (10.09.2011, 17:41)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

10.09.2011, 21:37

Das ist bisher so mein Test Konstrukt. Das Rechteck kann ich zeichnen sofern ich glDisable(GL_TEXTURE_2D); mache. Aber den Texture Ausschnitt zeichnet er mir leider nicht.
Ich denke mal, die Texture Koordinaten mit in den Buffer schreiben?

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
struct Vertex {
    float x, y, z;

    this(float x, float y, float z = 0.0) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

struct TexCoords {
    float tx, ty;

    this(float tx, float ty) {
        this.tx = tx;
        this.ty = ty;
    }
}

// ...

Vertex[] buffer;
buffer ~= Vertex(100, 100);
buffer ~= Vertex(200, 100);
buffer ~= Vertex(200, 200);
buffer ~= Vertex(100, 200);

TexCoords[] texbuffer;
texbuffer ~= TexCoords(0, 0);
texbuffer ~= TexCoords(0.2, 0);
texbuffer ~= TexCoords(0.2, 0.2);
texbuffer ~= TexCoords(0, 0.2);

GLuint vboId;
glGenBuffers(1, &vboId);

// ...

if (!set) {
    writeln("set buffer data!");
    set = true;

    glBindBuffer(GL_ARRAY_BUFFER, vboId);

    glBufferData(GL_ARRAY_BUFFER, buffer.length * Vertex.sizeof, null, GL_STATIC_DRAW);
    auto vPtr = cast(Vertex*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    for (uint i = 0; i < buffer.length; ++i) {
        vPtr[i].x = buffer[i].x;
        vPtr[i].y = buffer[i].y;
    }

    glUnmapBuffer(GL_ARRAY_BUFFER);

    glTexCoordPointer(2, GL_FLOAT, 0, &texbuffer[0].tx);
} else {
    glBindBuffer(GL_ARRAY_BUFFER, vboId);

    //glInterleavedArrays(GL_V3F, 0, null);

    tex3.bind();

    glInterleavedArrays(GL_T2F_V3F, 0, null);
    glDrawArrays(GL_QUADS, 0, buffer.length);
}

Ist btw. D, also nicht wundern über die Syntax.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

10.09.2011, 22:04

Achso, naja, ideal wärs, wenn du die Texcoords auch in den Buffer packst. Gib deinem Vertex doch einfach noch zwei floats für die Texcoords mit. Ansonsten müsstest du dein VBO natürlich unbinden, bevor du glTexCoordPointer() aufrufst ;)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

10.09.2011, 23:00

Hm, hab beides ausprobiert, einmal mit unbind und glTexCoordPoínter und einmal mit hinzufügen, was mach ich denn falsch?
Hier einmal der Versuch: http://www.rswhite.de/code/index.php?q=c…4c5f3f607fb4613
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

10.09.2011, 23:04

Oh, du verwendest glInterleavedArrays()!? Um ehrlich zu sein, hab ich das noch nie verwendet und keine Ahnung ob das überhaupt mit VBOs funktioniert. Vermutlich schon, aber ich würde davon Abstand nehmen und einfach glVertexPointer() und glTexCoordPointer() verwenden. Wenn auch beides deprecated ist, ist das die flexiblere Lösung.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (10.09.2011, 23:10)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

10.09.2011, 23:09

Für diese beiden brauche ich ja im Grunde gar keinen Buffer mittels glGenBuffers anlegen. Jedenfalls hatte ich diese Variante schon einmal probiert, es funktionierte reibungslos, jedoch wurde mir in Jabber mitgeteilt, das diese Variante kein wirklicher Vertex Buffer wäre. Daher erhoffte ich mir aus einem "korrekten" VBO noch mehr Performance Ausbeute.
Dies war mein Versuch mit Vertex und TexCoord Pointern: http://rswhite.de/code/?q=e8c5f8b61d3b5306455c269d9d1a7b6b
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

10.09.2011, 23:13

Ja. gl*Pointer() war ursprünglich für Vertex Arrays gedacht. Da hast du einfach Pointer auf ein normales Array reingestopft und fertig. Seit der Einführung von VBOs wird gl*Pointer() auch im Zusammenhang mit VBOs verwendet. Wenn ein VBO gebunden ist, entspricht der "Pointer", der dort übergeben wird, dem Offset der jeweiligen Daten im VBO in Byte. Wenn kein VBO gebunden ist, dann ist es ein normales Vertex Array. Das mit der Performance hängt von deinem Anwendungsfall ab. Die Grafikkarte kennt sowieso nur VBOs, d.h. der Treiber muss alles andere intern irgendwie über VBOs regeln. Wenn du dein VBO in jedem Frame updatest, wird das vermutlich nicht wirklich schneller sein als ein Vertex Array, da der Treiber sowieso nix andres tut, als dein Vertex Array in ein verstecktes VBO zu packen. Ein VBO ist im Prinzip ein Buffer, der im Grafikspeicher liegt. D.h. mit VBOs kannst du bestimmen, was wann wo wie auf die Grafikkarte geladen werden soll und es dann dort halten, anstatt ständig Vertex Arrays über den PCI Bus zu jagen. Genau das ist, wie du dir mit VBOs die Performance holst ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (10.09.2011, 23:24)


Werbeanzeige