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

1

20.06.2008, 18:42

Textur zieht sich in die Länge

Hallo Forum,

Das Problem was ich jetzt ansprechen will, hatte ich bereits schon mal und habe auch hier im Forum um Hilfe gebeten. Leider habe ich mein Problem ungenau definiert und es euch ziehmlich schwer gemacht mir zu helfen! Ich habe die Ratschläge die mir gegeben wurden befolgt undhabe mein Terrain, nach einer zeitweiligen Programmierer Pause, kommplett nu gemacht und um strukturiert. Ich habe mir auch einen Shader zum Texturieren geschrieben, mit dem ich Mehrere Texturen auf ein Polygon zeichnen kann. Ich habe alles einzelnd getestet und es klappte alles wunderbar, jetzt habeich aus den vielen Kleinichkeiten die ich gemacht habe, ein Terrain gebaut. Das Anzeigen des Terrains klappt auch ganz gut, nur leider zieht sich meine Textur immernoch in die länge!


(Link)


Seit gestern Abend versuche ich das Problem zu lösen, habe alles getahen was in meiner macht stand, ich habe mir nen zettel zu hand genommen und habe die Verticel alle einmal per hand durchgerechnet und skizziert, aber es sollte Funktionieren!

Die Positionen der Vertices Speichere ich folgendermaßen:

C-/C++-Quelltext

1
2
3
4
5
6
for (int x=0;x< WIDTH;x++) {
    for (int y= 0; y < HEIGHT;y++) {
        rgb[x][y] = GetPixel (hdcMem, x, y);
        cv_Vertices[y*WIDTH + x].X = -x;
        cv_Vertices[y*WIDTH + x].Y = y;
        cv_Vertices[y*WIDTH + x].Z = GetRValue(rgb[x][y])/50; } }


in "hdcMem" steckt die Heightmap!

Nun setze ich die Texturcoordinaten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int x=0;x< WIDTH-1;x++)
    {
        for (int y=0; y< HEIGHT-1;y++)
        {
            cv_Vertices[(y*WIDTH) + x].U = 1.0f; // 1

            cv_Vertices[(y*WIDTH) + x].V = 1.0f; // 1


            cv_Vertices[(y*WIDTH) + (x + 1)].U = 0.0f; // 2

            cv_Vertices[(y*WIDTH) + (x + 1)].V = 1.0f; // 2


            cv_Vertices[((y+1)*WIDTH) + x].U = 1.0f; // 3

            cv_Vertices[((y+1)*WIDTH) + x].V = 0.0f; //3


            cv_Vertices[((y+1)*WIDTH) + (x + 1)].U = 0.0f; // 4

            cv_Vertices[((y+1)*WIDTH) + (x + 1)].V = 0.0f; //4

        }
    }



Nach dem Laden der Heightmap, und der Positionssetzung, sind die Vertices folgendermaßen aufgebaut:

1-2-3
4-5-6
7-8-9

Nach der weise wie ich die Texturcoordinaten gesetzt habe, haben folgende Vertices diese Werte:

1 = 1.0U, 1.0V
2 = 0.0U, 1.0V
3 = 1.0U, 0.0V
4 = 0.0U, 0.0V

Wenn ich Nur uwei Dreiekce zeich ne, also ein Bild von 2x2 Pixel als heightmap lade, dieht die Ausgabe wie im obrigen Bild aus! Wenn ich aber mehrere mache, ist auf den Polygonen bloß eine graue Farbe zu sehen, sonst nix!

Könnte mir vllt jemand weiterhelfen, ich bin am verzweifeln!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

20.06.2008, 18:50

das problem liegt daran, dass du nur von 0 bis 1 denkst. du kannst die texturen auch "wiederholen", indem du das schema wie folgt weiterführst:

Quellcode

1
2
0-1-2-3-4-5-6-7
8-9-A-B-C-D-E-F


0 : 0.0 , 0.0
1: 1.0 , 0.0
2: 2.0 , 0.0
3: 3.0 , 0.0
...
7: 7.0 , 0.0
8: 0.0 , 1.0
9: 1.0 , 1.0
9: 2.0 , 1.0
....
usw.

dann sollte es klappen

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

20.06.2008, 19:10

Ich denke das Problem liegt eher nicht daran dass man Texturen auch kacheln kann...

das da:

C-/C++-Quelltext

1
2
3
4
5
            cv_Vertices[(y*WIDTH) + x].U = 1.0f; // 1

            cv_Vertices[(y*WIDTH) + x].V = 1.0f; // 1


            cv_Vertices[(y*WIDTH) + (x + 1)].U = 0.0f; // 2

            cv_Vertices[(y*WIDTH) + (x + 1)].V = 1.0f; // 2


überschreibt dir beim nächsten durchlauf der inneren Schleife die Werte die du zuvor für (y+1) gesetzt hast...

Wenn du willst dass auf jedes Viereck die ganze Textur kommt, musst du die Vertices für jedes Viereck extra anlegen. Benachbarte Vierecke können sich in dem Fall keine Vertices mehr teilen...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

20.06.2008, 19:24

Zitat von »"dot"«

Ich denke das Problem liegt eher nicht daran dass man Texturen auch kacheln kann...

das da:

C-/C++-Quelltext

1
2
3
4
5
            cv_Vertices[(y*WIDTH) + x].U = 1.0f; // 1

            cv_Vertices[(y*WIDTH) + x].V = 1.0f; // 1


            cv_Vertices[(y*WIDTH) + (x + 1)].U = 0.0f; // 2

            cv_Vertices[(y*WIDTH) + (x + 1)].V = 1.0f; // 2


überschreibt dir beim nächsten durchlauf der inneren Schleife die Werte die du zuvor für (y+1) gesetzt hast...

Wenn du willst dass auf jedes Viereck die ganze Textur kommt, musst du die Vertices für jedes Viereck extra anlegen. Benachbarte Vierecke können sich in dem Fall keine Vertices mehr teilen...


GENAU DAS habe ich ihm bereits vor Wochen einmal gesagt, dass das so nicht funktioniert. Ich weiss wirklich nicht, warum er unsere Tipps einfach nicht annimmt.. :roll:

5

20.06.2008, 19:29

Ja ich hatte viel ausprobiert dahatte ich das wohl übersehen die Schleife zu ändern!

Ich habe das jetzt gemacht wie mir Tromml gesagt hat:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (int x=0;x< WIDTH-1;x+= 2)
    {
        for (int y=0; y< HEIGHT-1;y+= 2)
        {
            
            cv_Vertices[(y*WIDTH) + x].U = x; // 1

            cv_Vertices[(y*WIDTH) + x].V = y; // 1


            cv_Vertices[(y*WIDTH) + (x + 1)].U = x+1; // 2

            cv_Vertices[(y*WIDTH) + (x + 1)].V = y; // 2


            cv_Vertices[((y+1)*WIDTH) + x].U = x; // 3

            cv_Vertices[((y+1)*WIDTH) + x].V = y+1; //3


            cv_Vertices[((y+1)*WIDTH) + (x + 1)].U = x+1; // 4

            cv_Vertices[((y+1)*WIDTH) + (x + 1)].V = y+1; //4

            
            
        }
    }


Jetzt ist was zu sehen, nur ziehen sich jetzt auf jedem Polygone die Textur in die Länge :/

Das müsste jetzt doch eigentlih funktionieren oder etwa nicht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

20.06.2008, 19:33

Zitat von »"Dustin Braun"«

Das müsste jetzt doch eigentlich funktionieren oder etwa nicht?


Genau das ist eben nicht das Problem. Lies doch nochmal genau was ich vorhin geschrieben habe ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

20.06.2008, 19:34

Zitat von »"Dustin Braun"«


Das müsste jetzt doch eigentlih funktionieren oder etwa nicht?


Nein. Und das immernoch aus dem gleichen Grund, der jetzt bereits 3 mal genannt wurde.. :roll:

8

20.06.2008, 19:37

Das hbe ich doch hiermit gelöst:

C-/C++-Quelltext

1
2
3
4
for (int x=0;x< WIDTH-1;x+= 2)
    {
        for (int y=0; y< HEIGHT-1;y+= 2)
        { 

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

20.06.2008, 19:40

hast du das? erklär doch mal was genau für ein problem du damit gelöst hast?

10

20.06.2008, 19:44

So wie ich verstanden habe, war das Problem, das ich die Coordinaten immer für den nächsten überschrieben habe, also so:

1. durchlauf:

1-2
3-4

2. durchlauf:

2-5
4-7

usw ....



Wobei es eigentlich so aussehen müsste:

1. durchlauf:

1-2
3-4

2. durchlauf:

5-6
7-8

usw ...


EDIT::::

Dadurch das ich nicht mehr um einen weiterspringe, sondern um 2, überschreibe ich die vorgänger nicht mehr!

Werbeanzeige