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

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

08.06.2009, 18:23

OpenGL Texture Mapping

Wie bereits in einem anderen Thread erwähnt, habe ich noch ein paar Probleme mit Texturing ^^
Als Übung in der Uni sollte ich u.a. eine Cylinderklasse schreiben, der man die Anzahl der Vertices übergeben kann, aus denen die Kreisflächen zusammengesetzt sein sollen...
Das habe ich soweit hinbekommen. Allerdings sollen wir jetzt das Teil noch Texturieren. Auch das habe ich hinbekommen.... jedenfalls wenn der Zylinder genug Ecken hat ^^
Ich habe es einfach so gemacht, dass ich die Textur einmal rund herum mappe, also einmal von 0.0f bis 1.0f laufe.
also einfach:
delta = 1.0f / vertices;
und dann eben indexDesFaces*delta als X-Koord. genommen habe für die Textur... Bilder habe ich angehängt. Muss ich da noch irgendwas anderes mit Berücksichtigen?

(Kann auch noch mehr Code posten, falls das gebraucht wird)

1000 Vertices:
http://www.pictureupload.de/pictures/080…dschirmfoto.png
8 Vertices:
http://www.pictureupload.de/pictures/080…chirmfoto-1.png

Edit: eine Seite besteht immer aus 2 Dreiecken.. da scheint das auch zu funktionieren, aber der übergang einer seite zur nächsten stimmt irgendwie nicht

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.06.2009, 19:20

Re: OpenGL Texture Mapping

Zitat von »"n0_0ne"«

Ich habe es einfach so gemacht, dass ich die Textur einmal rund herum mappe, also einmal von 0.0f bis 1.0f laufe.


Klingt eigentlich ganz vernünftig, wirst wohl irgendwo einen Fehler gemacht haben. Bekommen auch alle Vertices wirklich die richtigen Koordianten!?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

08.06.2009, 19:32

ich weiß nicht, wo genau da ein fehler sein soll, ich meine bei 1000 vertices funktioniert es ja (oder man sieht die fehler aus welchem grund auch immer nicht)

ich poste nochmal den relevanten code:

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
void Cylinder::renderAllFaces ()
{
    float delta = 0.5f / m_vertices;
    // start drawing a list of triangles

    glBegin (GL_TRIANGLES);

    // loop over all triangles

    for (unsigned int i = 0; i < faceArray.size(); ++i)
    {
        // bottom and top circle faces

        if (i < m_vertices + m_vertices)
            renderSingleFace(faceArray [i]);
        else // side faces

        {
            // index of the sideface

            int j = i - m_vertices - m_vertices; // starting with 0

            // first get the coordinates of the three corners of the triangle

            Vec4 p1 = vertexArray [faceArray [i].i1].pos;
            Vec4 p2 = vertexArray [faceArray [i].i2].pos;
            Vec4 p3 = vertexArray [faceArray [i].i3].pos;

            // now calculate the normal vector of the triangle

            Vec4 n = faceNormal (p1, p2, p3);

            // now we have collected all the information needed to draw the triangle

            // set the normal for all three vertices

            if (j % 2 == 0) // alternate, because one side is made out of two faces

            {
                glNormal3d (n[0], n[1], n[2]);
                // set first vertex

                glTexCoord2f (j*delta, 0.0f);
                glVertex3d (p1[0], p1[1], p1[2]);
                // set second vertex

                glTexCoord2f ((j+1)*delta, 0.0f);
                glVertex3d (p2[0], p2[1], p2[2]);
                // set third vertex

                glTexCoord2f (j*delta, 1.0f);
                glVertex3d (p3[0], p3[1], p3[2]);
            }
            else
            {
                glNormal3d (n[0], n[1], n[2]);
                // set first vertex

                glTexCoord2f (j*delta, 0.0f);
                glVertex3d (p1[0], p1[1], p1[2]);
                // set second vertex

                glTexCoord2f ((j-1)*delta, 1.0f);
                glVertex3d (p2[0], p2[1], p2[2]);
                // set third vertex

                glTexCoord2f (j*delta, 1.0f);
                glVertex3d (p3[0], p3[1], p3[2]);
            }
        }
    }
    // done, so do the drawing now

    glEnd();
}


Um das zu verstehen: eine Seite des Zylinders:
1 -- 2
| -\-- |
| --\- |
3 -- 4

Die Seite setze ich dann aus den Dreiecken: (3,4,1) und (4,1,2) zusammen (punkte in der reihenfolge)
Aber wie gesagt, die einzelnen Seiten passen, nur der übergang nicht?! :(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

08.06.2009, 19:43

Zitat

C-/C++-Quelltext

1
float delta = 0.5f / m_vertices;


warum 0.5?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

5

08.06.2009, 19:52

hhmmm, ja, da scheint wohl u.a. der Fehler drin zu sein, weil er sonst die textur 2 mal drumrum gemapped hat. anscheinend laufe ich zu "schnell" da durch. Ich hab mir das bild mit den 8 vertices nochmal angesehen, und wie es aussieht überspringt er immer eine seite dazwischen... nur bei 1000 verts ist das immer so wenig, dass mans nicht sieht

Edit: problem gelöst, danke dot, deine einfache frage hat mich dann nochmal zum nachdenken gebracht. habe den faceIndex (j) zu oft hochgezählt... jetzt nur noch jeden zweiten schleifendurchlauf, und dann das mappen von i, statt von j abhängig gemacht ^^

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

6

09.06.2009, 22:12

Habe nochmal ein Problem damit. Aus gegebenem Anlass habe ich mein Programm etwas umdesigned... Ich berechne jetzt nicht mehr beim rendern eines faces die texturkoordinate der vertices, sondern direkt am anfang wenn ich den zylinder erstelle und die vertices in einer liste speichere... d.h. die texturkoordinaten eines vertices werden auch direkt im vertice selbst gespeichert, und sind dann fest. beim rendern werden sie dann nur noch gelesen, was ich eben um einiges performanter fand.
Das funktioniert auch FAST. die letzte seite des Zylinders rendert er nicht richtig... und den Grund dafür habe ich auch erkannt. bei 6 seiten haben die beiden vertices (oben und unten) bei 0° natürlich als X-wert 0.0f. Das steigt dann bis zur letzten unterteilung an. die haben dann auch sinnvollerweise einen wert von 0,86....f, also nicht 1,0f, weil das ja im prinzip wieder die beiden ersten vertices wären... weil die aber nicht 1,0 sondern immer noch 0,0 haben, rendert er die textur nochmal falschrum von 0,8X bis 0,0 auf die letzte seite... das ist natürlich nicht gewollt! Eine Lösung wäre natürlich, die ersten beiden vertices (ich meine wieder oben und unten) jeweils doppelt zu speichern, und dann einmal mit 0,0 und einmal mit 1,0... die lösung gefällt mir aber nicht so wirklich... gibt es da noch eine andere möglichkeit? z.B. OGL explizit zu sagen, dass er bei 0.8 nach 0.0 eigentlich nach 1.0 mappen soll?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

09.06.2009, 22:14

nimm halt als delta net 1 / m_vertices sondern 1 / (m_vertices - 1) ;)

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

8

10.06.2009, 07:51

jo, hatte ich schon versucht, aber logischerweise ändert es das Problem nur minimal ^^
dann würde er auf die letzte seite nochmal die ganze textur mappen. ich versuche es mal hier zu verdeutlichen. der Zylinder mal aufgerollt mit m_vertices=5

..|\-----|\-----|\-----|\-----|\-----|
..|--\---|--\---|--\---|--\---|--\---|
..|---\--|---\--|---\--|---\--|---\--|
..|-----\|-----\|-----\|-----\|-----\|
0.0 0.2 - 0.4 - 0.6 - 0.8 - 0.0

Die Kante ganz links und ganz rechts ist natürlich die selbe. auf die letzte seite, zwischen 0,8 und 0,0 mappt er jetzt die textur noch einmal verkehrt herum drauf (nicht ganz, 1,0 bis 0,8 fehlt natürlich)

Dein vorschlag würde dann das hier draus machen:
..|\-----|\-----|\-----|\-----|\-----|
..|--\---|--\---|--\---|--\---|--\---|
..|---\--|---\--|---\--|---\--|---\--|
..|-----\|-----\|-----\|-----\|-----\|
0.0 0.25 0.5 - 0.75 - 1.0 0.0

Dann wäre die textur zwar einmal komplett drauf, aber auf der letzten seite dann auch nochmal... total gequetscht

Werbeanzeige