[DX10] Texture Arrays - Terrain Texturierung

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
keepcoding
Beiträge: 30
Registriert: 28.11.2003, 17:19
Kontaktdaten:

[DX10] Texture Arrays - Terrain Texturierung

Beitrag von keepcoding »

Hi!

Da DX10 ja Texture Arrays unterstützt, wollte ich diese nun für mein Terrain einsetzen.
Idee: max. drei Texturen pro Texel (entspricht einem Vertex des Terrains), max. 16 Texturen für das gesamte Terrain. In den ersten beiden Kanälen die Blend-Values (das dritte Blend-Value kann ja im Shader berechnet werden) und in den letzten zwei Kanälen je 4 Bits für den Texturindex im Array.
Problem: In den Übergangsregionen entstehen hässliche Artefakte (hab ich mir auch gedacht, dass das Blenden von Indices nicht so schön funktioniert). Dieses Problem wurde auch im Paper von Nvidia zum 'Texture Array Terrain' Sample angesprochen, doch irgendwie werde ich aus der Erklärung nicht ganz schlau, wie (und ob) ich dieses Problem geschickt umgehen kann.

Hat jemand dazu eine Lösung oder einen besseren Ansatz?
Ich möchte halt nur eine Alphamap verwenden (32-Bit), aber im Moment bin ich mir nicht mehr so sicher, ob dies überhaupt möglich ist...
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX10] Texture Arrays - Terrain Texturierung

Beitrag von Schrompf »

Knifflig. Terrainpunkt 1 hat 3 Materialien, Nachbarpunkt TP2 hat drei andere. An der Kante zwischen den beiden Punkten hast Du also 6 Materialen in verschiedenen Anteilen. Das scheitert aus Prinzip.

Ich kenne das Paper nicht, aber mir scheint die einzige methoden-spezifische Lösung zu sein, bei der Terraintexturierung Sicherheitsbereiche an den Materialwechseln vorzusehen. Also TP1 mit 3 Mats, dann ein Punkt, bei dem eins der Mats mit Anteil 0.0f vorkommt, dann noch ein Punkt mit dem neuen Mat mit Anteil 0.0f und erst der dritte Nachbar darf dann das neues Material mit sichtbarem Anteil benutzen.

Korrektur: ein Zwischenpunkt mit nur zwei Material müsste reichen. Allerdings müsste man für die Textur mit den Material-Indizes nur Texturfilter POINT benutzen. Doppelkorrektur: nein, es müssen zwei Zwischenpunkte sein, da die Interpolation der Material-Gewichte ja bis zum Nachbarpunkt geht. Ein einzelner Zwischenpunkt zwischen zwei Punkten müsste also *alle* benachbarten Materialien führen, wenn auch die nicht-fortgesetzten mit Anteil 0.0f.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
keepcoding
Beiträge: 30
Registriert: 28.11.2003, 17:19
Kontaktdaten:

Re: [DX10] Texture Arrays - Terrain Texturierung

Beitrag von keepcoding »

Danke für deine Antwort. Klingt irgendwie sinnvoll, doch die Implementierung dessen dürfte nicht ganz einfach sein. Falls ich das nicht hinkriege muss ich mir wohl doch was anderes überlegen...
Noch ein Gedanke, der mir nicht gefällt: Ich codiere die Texturindizes in der dritten und vierten Komponente der Textur, d.h. in der 3. Komp. zwei Indizes (die lower vier Bits für die erste Textur, die upper 4 Bits für die zweite). Ich kann mir nicht vorstellen, dass das sinnvoll interpoliert wird, oder doch?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX10] Texture Arrays - Terrain Texturierung

Beitrag von Schrompf »

Nein, die Interpolation tötet Indices definitiv. Das gilt noch viel mehr für so Bitspielereien wie das Kombinieren zweier Werte in einen. Daher mein Hinweis, unbedingt den POINT-Filter zu benutzen. Der wirkt dann leider auch auf die Material-Anteile, und die willst Du ja interpoliert haben. Du wirst die beiden in zwei getrennte Texturen aufspalten müssen, um das zu erreichen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten