Community-Tutorials (Source)

Detail-Texturen

Hallo liebe Community!

Ein Forumeintrag hier, erinnerte mich an ein Feature der Source-Engine, über das ich zwar irgendwann mal etwas gelesen hatte, mich aber nicht mehr weiter damit beschäftigte. Nun hab ich mich etwas schlauer gemacht und möchte mein Wissen mit euch teilen ... zumal ich finde, dass dieses Feature allgemein viel zu wenig Beachtung bekommt.

Die Rede ist von der Möglichkeit den Texturen eine zweite, kleinere Textur zuzuweisen, die der Basistextur mehr Details verleihen soll. Diese Textur werde ich im folgenden als Detail-Textur bezeichnen.

Was ist eine Detailtextur?

Die Detail-Textur ist in der Regel eine Graustufen-Grafik und deutlich kleiner als übliche Texturen ... 64 Pixel Seitenlänge erscheinen mir als guter Wert.
Wie soll nun mit solch einer Textur ein höherer Detailgrad geschaffen werden, mag sich manch einer fragen ...
Das wird bewerkstelligt indem die Detail-Textur über eine Basistextur gelegt wird und kleiner skaliert wird als gewöhnliche Texturen. Somit hat man quasi zwei Texturen in einer:

- einmal die normale Textur mit Bumpmaps, Spiegelungen usw
- und einmal eine kleinere sw-Textur, die in der Basistextur mehrfach gekachelt wird

Somit umgeht man den Effekt, dass Texturen aus der Nähe total verschwimmen, denn die Detail-Textur kann der Basistextur eine (beispielsweise körnigere) Struktur verleihen, die erst aus der Nähe richtig zum Tragen kommt. Natürlich ist das kein Ersatz für hochauflösende Texturen, aber es ist eine sehr ressourcensparende Alternative dazu!
Wer noch nicht verstanden hat, was ich meine, scrollt runter, schaut sich die Bilder an und scrollt anschließend wieder hierher zurück :D

Wie erstelle ich eine Detail-Textur?

Öffnet euer Grafikprogramm (ich benutze Photoshop) und erstellt ein 64x64 Pixel großes Graustufen-Bild. Anschließend tobt ihr euch einfach ein wenig mit dem Störungsfilter aus ... unser Ziel ist es eine möglichst gleichmäßig gekörnte Grafik zu erstellen.

Tip:
am Ende könnt ihr den „Hochpass“-Filter drüberlaufen lassen um gleichmäßigere Strukturen zu bekommen und hässlichen Kachel-Effekten vorzubeugen. Außerdem ist die Grafik dann ausgeglichener was die Grauwerte angeht ... das resultiert dann darin, dass die Basistextur nicht heller oder dunkler wird wenn bei der Detail-Textur zB weiß oder schwarz vorherrscht.
Wenn ihr mit dem Unschärfefilter gearbeitet habt, solltet ihr auch sicherstellen, dass die Textur kachelbar wird. Wählt den „Verschiebungseffekt“-Filter aus, versetzt das Bild 32 Pixel in beide Richtungen und beseitigt dann die Kanten

Wenn ihr fertig seid, solltet ihr sowas hier haben:

hambo001.jpg

Je nach Verwendungszweck sollte natürlich auch die Detail-Textur variieren. Die obere Textur bietet sich beispielsweise für Mauerwerk, Asphalt usw an.
Für Holz sollten längliche Strukturen, die sich nach der Maserung der Basistextur richten, vorherrschen. Das lässt sich ganz gut mit dem Bewegungsunschärfe-Filter bewerkstelligen.
Hier ein Beispiel für ein Holz-Detail:

hambo002.jpg

Wer keine Lust hat eigene Detail-Texturen zu erstellen, kann gerne diese hier runterladen und benutzen. Das sind allerdings Jpegs, ihr müsst sie also zunächst in tga-Dateien umwandeln.

Damit wäre dieser Teil fast abgehakt ... wandelt die tga-Datei jetzt in eine vtf-Datei um. Wenn ihr nicht wisst wie man das macht, klickt hier.

Was mache ich nun mit der vtf-Datei?

Wenn ihr alles richtig gemacht habt, befindet sich eure Detail-Textur zusammen mit all euren anderen Texturen im „materials“-Ordner.
Sucht euch nun eine Textur aus, die eine Detail-Textur verpasst bekommen soll und öffnet die vmt-Datei der entsprechenden Textur. Anschließend tragt ihr die folgenden Zeilen ein:

"$detail"	"Pfad zu eurer Detail-Textur"
"$detailscale"	"wie oft die Detail-Textur in der Basistextur gekachelt werden soll"

Hier ein Beispiel für eine fertige vmt-Datei:

"LightMappedGeneric" 
	{
	"$basetexture" 	"Al/Concrete"
	"$bumpmap"		"Al/ConcreteBump"
	"$surfaceprop"	"rock"
	"$detail"		"Al/Detail1"
	"$detailscale"		"20"
}

Nun ist die Textur fertig und kann verwendet werden. Ob das Ergebnis aber gut aussieht, ist die große Frage. Im nächsten Abschnitt soll gezeigt werden wie sich der "$detailscale"-Parameter auf die Bildqualität auswirkt.

Tip:
Detail-Texturen könnt ihr auch für eure Models verwenden. Der Vorgang ist genau der selbe wie bei den normalen Texturen. Ihr müsst lediglich auf die korrekten Pfade achten.

"$detailscale"

Zunächst einmal etwas Mathe ...
Nehmen wir an, dass die Basistextur 512x512 Pixel und die Detail-Textur 64x64 Pixel groß ist. Somit würde die Detail-Textur acht mal in die Basistextur passen ohne, dass sie skaliert werden müsste. Würden wir also in die vmt-Datei der Basistextur "$detailscale" "8" eintragen, hätten wir im Endeffekt keinen höheren Detailgrad gewonnen ... die Basistextur würde nur etwas dreckiger aussehen.
Wir wollen der Basistextur aber eine feinere Struktur verpassen, also müssen wir in unserem Fall einen Wert nehmen, der größer als acht ist. Je größer der Wert ist, desto feiner wird die Detail-Textur aufgelöst. Aber Achtung: ein größerer Wert ist nicht immer besser. Es gilt einen guten Mittelwert zu finden.
Die folgenden Bilder sollten vermitteln was ich meine:

Dieses Bild zeigt in kleinen Schritten die Auswirkungen von höheren „$detailscale“-Werten

hambo003.jpg

Hier sieht man ganz gut, dass der Kachel-Effekt bei höheren Werten unvermeidlich ist. Mit einer detaillierten Basistextur fällt es allerdings kaum mehr auf

hambo004.jpg

Wie so vieles, kann man auch diesen Wert auf die Spitze treiben ... so richtig praxistauglich ist das aber nicht

hambo005.jpg

Hier mal ein Direktvergleich. Links: ohne Detail; Rechts: mit Detail

hambo006.jpg

Aus dieser Entfernung ist der Unterschied schon deutlich besser zu erkennen

hambo007.jpg

Das selbe Spiel nochmal mit Holz

hambo008.jpg
hambo009.jpg

Praxistauglichkeit:

Wie gut das Ganze letztendlich im Spiel aussieht, hängt davon ab wie sehr ihr auch mit den Detail-Texturen auseinandersetzt. Oft muss man lange herumexperimentieren bis man mit einem Ergebnis zufrieden ist. Ein Wert, der bei einer Textur gut aussieht kann bei der nächsten Textur schon wieder mies aussehen. Andere Texturen hingegen sind ohne Detail-Texturen besser dran.
Was die Performance angeht habe ich, trotz exzessiven Gebrauchs von Detail-Texturen, kaum einen Einfluß festgestellt. Die folgenden Screenshots sprechen wohl für sich.

hambo010.jpg
hambo011.jpg

Ich hoffe ich habe mit diesem Thread den ein oder anderen dazu angeregt, selber Gebrauch von Detail-Texturen zu machen.

PS: Für Verbesserungsvorschläge bin ich immer offen! Ich hab erst gestern die Detail-Texturen für mich entdeckt und es kann gut sein, dass einige Dinge hier nicht angesprochen wurden.