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

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

11

18.02.2014, 20:28

Zitat von »OOTD«

Optimal ist immer wenn das Tile genauso viele Pixel hat, wie der Bereich auf dem du sie darstellst

Das ist in einer beweglichen 3D-Umgebung unmöglich.
Wenn man näher heran geht, wird es größer und anders rum.
Dafür gibt es aber zum Glück (mehr oder weniger gute) Filter und das muss nicht dein Problem sein.

Zitat von »OOTD«

Um eine Textur zu Kacheln, musst du sie so erstellen das der Linke Rand mit dem rechten Rand zusammen passt, perfekt ist es wenn sie auch am Oberen und Unteren Rand zusammen passt

Beides ist gleicher Maßen erforderlich. Wieso sollten Kanten in die eine Richtung nicht stören?
Ich denke, soweit waren wir bereits. Um kachelbare/nahtlose Texturen(so nennt man diese) zu erzeugen wurde ja schon einiges genannt.

Zitat von »BlueCobold«

Wenn Du mehr Variation willst, brauchst du mehr Texturen.

Ja, oder einfach größere Texturen mit der gleichen Strukturgröße.
Wenn die Textur doppelt breit/hoch ist, wiederholt es sich in der Szene am Ende 2 mal weniger in der Länge/Breite.
Den Tapeteneffekt(also wenn man deutliche Muster in der Kachelung erkennen kann) lässt sich so mit einen Aufpreis an Speicher gut verringern. Wenn man Texturen mit einen Programm wie Genetica, Resynthesizer oder Filterforge erstellt, kann man die Größe des Ergebnisses ganz einfach einstellen.

12

18.02.2014, 20:42

Die Größe kann man aber teilweise erahnen (es gibt Bereiche wo der normale Nutzer eher nicht nah dran geht und welche wo dies sehr wahrscheinlich ist).
Weiter weck ist durch erwähnte MipMaps gut machbar.

Es ist wie gesagt nicht beides erforderlich, wenn man drauf achtet welche Kacheln zusammen passen, kann man auch anders arbeiten !
Ich benutze Kacheln die nicht alle Passen, dann muss man dem Computer nur sagen wie er das Puzzel lösen kann ^^
Das ist jedoch Programmieraufwand, daher sagte ich ja das Optimal alle Kanten passen (Optimal bequem, nicht unbedingt Qualitativ optimal) !


Doch ich mache meine Texturen von Hand, das war hier ehh nicht Thema wie ich zu spät bemerkt habe, erwähnt wollte ich es aber haben (denn diese Aussage war richtig).

Edit :
Ergänzung zum Verständnis:
Es lässt sich mit Domino vergleichen, ein Stein muss nicht unbedingt mit 1 enden nur weil er mit 1 beginnt, wenn er mit 2 endet brauchst du ein Stein der mit 2 beginnt und wenn dieser mit 1 endet hast du den Kreis geschlossen (natürlich kann er auch mit 3 enden, ein Stein von 3 auf 1 schließt dann den Kreis ...).

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »OOTD« (18.02.2014, 20:50)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

18.02.2014, 20:50

Das ist in einer beweglichen 3D-Umgebung unmöglich.
Wenn man näher heran geht, wird es größer und anders rum.
Ja und nein. Z.B. ein Shooter wird dem Spieler immer nahezu denselben Abstand der Kamera zum Boden präsentieren. Hier zu wenig Auflösung zu bieten sieht man schnell. Die Texturen unnötig hoch aufzulösen hat aber auch wieder nur Nachteile. Es lässt sich in vielen Spielen und Situationen eine sinnvolle Auflösung für viele Texturen bestimmen. Dennoch ist es natürlich eher eine PI*Daumen Geschichte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

18.02.2014, 21:00

Zitat

Es lässt sich mit Domino vergleichen, ein Stein muss nicht unbedingt mit 1 enden nur weil er mit 1 beginnt, wenn er mit 2 endet brauchst du ein Stein der mit 2 beginnt und wenn dieser mit 1 endet hast du den Kreis geschlossen (natürlich kann er auch mit 3 enden, ein Stein von 3 auf 1 schließt dann den Kreis ...).

Ähm doch.
Im Domino hast du vielleicht mehrere Steine.
In der Grafik jedoch, hat man nur eine Textur. Mehrere Texturen nebeneinander legen und gemeinsam kacheln geht normalerweise nicht. (oder macht keinen Sinn.)

15

18.02.2014, 21:10

? bin ich jetzt total verpeilt ?
Reden wir von verschiedenen Sachen ?
Kacheln heißt für mich genau das !
Ich setze z.B. mein Hintergrund aus vielen Quadraten zusammen, der einzige Unterschied zu Domino es gibt 4 Kanten statt 2 !
das macht es etwas komplexer, doch es bleibt das Prinzip und es funktioniert nachweislich (ich habe es RGBA auf RGBA vor mir) ;)
Ich zerlege teilweise auch 1ne Textur in viele Teile (daher der Hinweis auf Ungenauigkeiten beim Bruchteil 1nes Pixel), warum sollte das kein Sinn machen ?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

16

18.02.2014, 21:32

Unter Kachelung im engeren Sinn versteht man meiner Auffassung nach, wenn man einen Bereich mit Texturkoordinaten mit einer Differenz > 1 versieht und die Textur somit wiederholt wird.

Zitat

warum sollte das kein Sinn machen ?

Aus verschiedenen Gründen.
Zum einen versagt dann die eingebaute Filterung und es kann Kanten geben und zum anderen ist es uneffizient.
Mehr Texturen führen zu mehr Texturänderungen, also zu mehr Statechanges und Drawcalls die gerne mal zum Flaschenhals werden. Die aller neuste Treibergeneration bietet auch bindless-Texturen, da ist dieses Problem dann nicht mehr so ausgeprägt. (Kann man aber ganz klar noch nicht voraussetzen, weil es auch noch gar nicht im OpenGL-Core ist.) Siehe GL_NV_bindless_texture
Und selbst das wird nicht so performant sein wie eine durchgehende Textur.
In der Regel geht man deshalb eher den umgekehrten Weg und kombiniert mehrere Texturen in einem "Texturatlas" (oder Texturarray.)

17

18.02.2014, 22:21

Vielen dank an Spiele Programmierer :)
Also ich möchte hier noch mal wiedergeben was unser Problem war :
Er meinte das es nicht sinnvoll ist, viele kleine Tiles zu laden (da Textur-Wechsel eine großes Nadelöhr in der 3D-Grafik sind).
Ich habe mich schon vor langer Zeit da mit beschäftigt und dies gelöst durch viele Tiles auf einer Großen Textur (wie ich erfahren habe ist meine Technik kein Kacheln im eigentlichen sinne).
Ich benutze immer Textur-Koordinaten deutlich <1, Kachel bedeutet allgemein Textur-Koordinaten deutlich >1.
Meine Technik hat viele Nachteile :
Besonders die genannten Ungenauigkeiten (durch winzige Werte) und
Unterbrechungen der Übergänge (wiedermal durch winzige werte)
Winzige Werte (bedeutet, viele Stellen hinter dem Komma (wer Programmiert kennt sicher die Rundungs-Ungenauigkeit von Gleitkomma-Werten)).

Daher umgehe ich 1 Problem und schaffe 2 neue, diese habe ich wie folgt gelöst :
Auf der Textur, wähle ich immer ein Bereich aus der ein Bruchteil 1nes Pixels kleiner ist und
lasse die Primitive um den Bruchteil 1nes Pixels überlappen.

Insgesamt muss ich mit einem Pixel Differenz rechnen und auch so zeichnen !

Nicht zu vergessen ist, das ich mehr Vertex benötige !
Der Vorteil ist jedoch :
Eine sehr hohe Flexibilität (ich kann meine Texturen wie Dominosteine behandeln) !
Wie vieles in der Programmierung und im Leben ist es also relativ ;)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

18

18.02.2014, 22:29

Zitat

Besonders die genannten Ungenauigkeiten (durch winzige Werte)

Da muss ich dich schon wieder verbessern. ;)
Bei Gleitkommazahlen ist die Größenordnung nicht von Bedeutung, das ist der Vorteil gegenüber Festkommazahlen. Die Zahlen werden als Mantisse und Exponent gespeichert. Aber in dem Fall ist völlig irrelevant. Die Genauigkeit von Gleitkommazahlen einfacher Genauigkeit reicht dafür locker aus.

Das Entscheidende ist: Du hast scheinbar eine ganz andere Problemstellung.
Aus dem Kontext lese ich heraus, das du wohl im (unskalierten) 2 dimensionalen mit einer Tilemap arbeitest. Eine Tilemap ist aber etwas ganz anderes als Kachelung (die Wiederholung einer ganzen Textur) und eine ganz andere Problemstellung.
Hier geht es um die Texturierung von 3 dimensionalen Objekten mit der selben Struktur.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

19.02.2014, 06:38

In der Grafik jedoch, hat man nur eine Textur. Mehrere Texturen nebeneinander legen und gemeinsam kacheln geht normalerweise nicht. (oder macht keinen Sinn.)
Das ist Quatsch. Sogar großer. Genau das macht man nämlich in sehr vielen Spielen, die auf Tiles basieren. Dort werden kachelbare Texturen (oder Sprites aus einem Atlas) nebeneinander gelegt. Verschiedene. Und alle passen nahtlos aneinander.

Mehr Texturen führen zu mehr Texturänderungen, also zu mehr Statechanges und Drawcalls die gerne mal zum Flaschenhals werden.
Genau dafür gibt es Textur-Atlanten und Texture-Arrays. Das erfordert weder mehr Statechanges, noch mehr Drawcalls und somit gibt es dort auch keinen Flaschenhals.

Und selbst das wird nicht so performant sein wie eine durchgehende Textur.
Weil? Reden wir jetzt hier etwa ernsthaft über Nanosekunden?

In der Regel geht man deshalb eher den umgekehrten Weg und kombiniert mehrere Texturen in einem "Texturatlas" (oder Texturarray.)
Und damit widerlegst Du die Aussagen aus Deinem kompletten Beitrag selbst.

Ich benutze immer Textur-Koordinaten deutlich <1, Kachel bedeutet allgemein Textur-Koordinaten deutlich >1.
Meine Technik hat viele Nachteile :
Besonders die genannten Ungenauigkeiten (durch winzige Werte) und
Unterbrechungen der Übergänge (wiedermal durch winzige werte)
Problem gelöst: http://0fps.net/2013/07/09/texture-atlas…nd-mip-mapping/

Aus dem Kontext lese ich heraus, das du wohl im (unskalierten) 2 dimensionalen mit einer Tilemap arbeitest. Eine Tilemap ist aber etwas ganz anderes als Kachelung (die Wiederholung einer ganzen Textur) und eine ganz andere Problemstellung.
Nö. Ist keine andere Problemstellung. Ist genau dasselbe, nur eben statt eine ganze Textur zu wiederholen, sollen nur Ausschnitte wiederholt werden. Der obige Link behandelt das Thema super.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (19.02.2014, 06:46)


20

19.02.2014, 10:55

Vielen dank für den Link, Array-Texturen haben das Problem mit den Ungenauigkeiten gelöst :thumbsup:
Zum Glück habe ich sehr sauber gearbeitet und musste für diese änderung nur 1ne Klasse CImage und die Methode LoadTextur anpassen :)

Werbeanzeige