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

drz

Frischling

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

1

02.07.2009, 09:59

Kachelbare Texturen und IndexBuffer

Hallo Leute,

ich hab da mal eine Frage zu kachelbaren Texturen und dem effizienten Ausnutzen des IndexBuffer. Texturen kann ich ja mit Angabe der uv Koordinaten mit 0/0 -> 1/1, 0/0 -> 1/1 oder 0/0, 1/1, 2/2 u.s.w kacheln.

Der Indexbuffer erspart mir das doppelte Definieren von Vertex auf der selben Position.

Nun die Frage: Wenn ich durch den IndexBuffer nur einen Vertex pro Position habe, wie kann ich dass mit den denoch unterschiedlichen Texturkooordinaten auf eben dieser Position lösen.

Ach ja, mein Gedankenspiel dreht sich um eine Plane ( Fläche ). Hilft mir dabei vielleicht: D3DTADDRESS_WRAP weiter?

Ich habe bisher noch keinerlei Tests in dieser Richtung gemacht, sondern nur den Gedanken im Kopf, meine Vertexstruktur zu optimieren.

Vielen Dank für jegliche Hinweise.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

02.07.2009, 10:43

Zitat von »"drz"«


Nun die Frage: Wenn ich durch den IndexBuffer nur einen Vertex pro Position habe, wie kann ich dass mit den denoch unterschiedlichen Texturkooordinaten auf eben dieser Position lösen.


mit mehreren texturkoordinaten.

entweder per multitexturing oder per shader legst du die beiden texturen
(die die gleichen sein können) auf z.b. die ersten beiden texturschichten.

allerdings frage ich mich was das soll? wenn du eine ebene oder allgemein
eine grade fläche hast, brauchst du doch keine verschiedenen textur-
koordinaten?

wie baust du den die ebene auf? also grid oder einfach quad?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

drz

Frischling

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

3

02.07.2009, 10:52

Es ist natürlich keine einfache Ebene, dann wäre es ja kein Problem. Es ist ein TriangleStrip mit 100 x 100 Quads. Hier benutze ich bereits einen indexBuffer, um nur 4 Vertex Pro Quad zu schreiben. Die Höheninformation kommt aus einer Heightmap.

Ich muss also 40000 Vertex speichern wobei, es aber eigentlich nur 1000 verschiedene Positionen gibt. Dies ist sicherlich über einen IndexBuffer zu lösen, aber was mache ich mit den Texturkoordinaten, die eben nicht auf jeder Position gleich sind?

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

4

02.07.2009, 12:46

bei 100 x 100 haben wir 1000, nicht 100 :D

was spricht dagegen einfach jedem vertex seine position und seine
texturkoordinate zu geben?

von oben (senkrecht drauf) würde man dann die unveränderte textur
sehen können.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

drz

Frischling

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

5

02.07.2009, 13:00

Ich seh gerade, ich hatte einen kleinen Denkfehler.

Bei einem Feld von 100x100 Quads habe ich jetzt 40.000 Vertex. Wenn ich nun einen IndexBuffer so implementieren könnte, das auf jeder Position nur noch ein Vertex steht, kann ich knapp die Hälfte aller Vertex sparen.

Weniger Vertex ist weniger Speicherverbraucb und weniger zu Tranformieren. Nur die Textur-Koordinaten kann ich dann eben nicht mehr vergeben, weil die Vertex an den Eckpunkten shared sind. Dafür suche ich eine Lösung.

6

02.07.2009, 13:26

Du hast eine heighmap und willst da eine Textur drüber legen. Warum brauchst du jetzt unterschiedliche Texturkoordinaten? Die sind pro Vertex gleich, damit hat man schön flüssige Übergänge.
Wenn du aber jetzt z.b. Tiles dürber legen willst, also jedes Viereck hat einen anderen Texturausschnitt und die Übergänge sind nicht fließend, dann wirst du halt mehr Vertexe benötigen. Ist ja bei harten Kanten genauso, du brauchst mehr Normalen also auch mehr Vertexe.
Evtl. könnte man das auch mit Multitexturing lösen, das wird aber komplizierter und das rendern dürfte länger dauern, dann würde ich eher ein wenig mehr Speicher beanspruchen.
Lieber dumm fragen, als dumm bleiben!

drz

Frischling

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

7

02.07.2009, 14:44

Ok, dann hol ich mal etwas weiter aus und erklär die komplette Geschichte.

Ich versuche mich gerade an der optimierung des Terrainrendering. Mein aktuelles Terrain besteht aus 100x100 Quads die als TriangleStrip gerendert werden.

Die Höheninformationen kommen aus einer Heightmap welche ich lese und damit das komplette Mesh erstelle bevor ich es inn den VertexBuffer lade.
Hier kommt ebenfalls ein IndexBuffer zum Einsatz, der aus 4 Vertex ein Quad erstellt.

Jeder Vertex hat zwei Texturkoordinaten: Einmal für die Alphamap und einmal für die bis zu 3 Texturen, die gekachelt werden. Ein D3dxEffekt errechnet mir, anhand der Alphamap, welche der drei Kacheltexturen an welcher Stelle angezeigt werden.

Nun möchte ich eben einfach die Anzahl der Vertex im Buffer reduzieren, weil viele davon in Ihrer Position redundant sind, und sich nur in der Texturkoordinaten unterscheiden.

Vielleicht geht das eben nicht so einfach, wie ich mir dass vorstelle. Dann muss ich wohl die vielen Vertex in kauf nehmen.

In jedem Fall danke ich euch, für eure Antworten und würde mich freuen, noch ein wenig mehr Ratschläge dazu zu lesen.

bye

8

02.07.2009, 15:55

Wenn ich das richtig verstehe, dann hast du für jedes Quad auf deiner Fläche 4 Vertices, was in diesem Fall 100x100=40000 Vertices entspricht.
Erstelle doch deine Fläche so, dass du die Fläachen aneinanderhängst.
Dann hast du bei 100x100 nur 10000 Vertices.
Und die zu kachelnde Textur kannst du ja z.B. so anordnen.
Linke Obere Ecke 0.0f,0.0f nächster nach rechts 1.0f,0.0f nächster 2.0f,0.0f u.s.w.

drz

Frischling

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

9

02.07.2009, 17:36

Das ist genau dass, was ich will Andi0310. Mein Problem ist nur das Zuweise der Texturkoordinaten speziell an den Stellen, wo sich 4 Quad's einen Vertex teilen.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

10

02.07.2009, 20:08

ich habs immernoch nicht gerafft :(

Zitat von »"drz"«


Mein aktuelles Terrain besteht aus 100x100 Quads die als TriangleStrip gerendert werden.


hm ok entweder du renderst jedes quad einzeln, oder nutzt irgentwelche
degenerierten dreiecke als verbindung, aber 2 quads, die sich keine
vertices teilen kann man so doch nicht gut rendern??

Zitat von »"drz"«


...und sich nur in der Texturkoordinaten unterscheiden.


warum tun sie das?
wenn du die texturen kachelst, sprich addressU und addressV auf wrap
setzt, ist es der textur doch egal ob sie (z.b. für die u koordinate)
zwischen 5.f und 6.f aufgespannt wird, oder 8.f und 9.f.
schließlich wiederholt sie sich.

mach doch einfach einen vertexbuffer der nur die 100 x 100 = 10000
vertices schön im gittermuster enthällt. keinen doppelt.
jeder vertex bekommt 2 texturkoordinaten:
die erste geht von 0 bis 1 (aufs ganze terrain bezogen). das heißt
für jeden vertex 0 - 1/N - 2/N - 3/N (terrain ist N vertices lang).
diese koordinaten ntzt du für die alphamap.

die zweite geht 0 - 1 - 2 - 3... - N. (zählt jeden vertex einmal hoch)
darüber packst du dann die anderen texturen, die sich aufgrund
der kachelung für jeden vertex wiederholen.

jetzt nurnoch blenden und fertig.

natürlich muss der indexbuffer entsprechend gefüllt sein[/code][/quote]
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Werbeanzeige