Community-Tutorials (Source)

Spiegelnder Boden

Hi,

in meinem 2. Tutorial hier auf Mapping Tutorials will ich euch geläufig machen, wie man schöne Spiegelungen auf z.B. einer sauberen Fließentextur realisieren kann. Aussehen soll das ganze zum Schluss so:

mapmaster004.jpg

Bevor es zur Sache geht, solltet ihr Folgendes installiert haben :

-GCF Scape, Tool zum Extrahieren von Dateien, die in GCF’s (Game cache file) gepackt sind.

http://nemesis.thewavelength.net/index.php?c=76

Dies sollte in Kenntnis sein:

-Das importieren von Texturen in die Sourceengine:

http://www.mapping-tutorials.de/forum/showthread.php?t=1265 (Die Textur selbst)

http://www.mapping-tutorials.de/forum/showthread.php?t=1267 (Normalmap)

Wem das auf diese Weise zu stressig ist, kann auch mittels des Tools "360g" vom Forenmitglied "Jodokus" vorgehen. Zu finden ist es hier:

http://www.mapping-tutorials.de/forum/showthread.php?t=3210&highlight=360g

Das sollte vorhanden sein:

-Die Texturinformationsdatei "water_canals_water2.vmt". Da diese in den GCF’s gepackt ist, müssen wir sie extrahieren. Deshalb wies ich darauf hin, besagtes Tool zu installieren. Die Datei können wir in "source materials.gcf" unter dem Pfad "materials/nature/" finden.

Ihr werdet euch bestimmt fragen: Wozu braucht man für einen Spiegeleffekt die Eigenschaften einer Wassertextur? Nun, wer die Wassereffekte aus Half Life 2 kennt, weiß, dass diese recht hübsche Spiegeleigenschaften an sich haben. Allerdings haben sie für unsere Thematik auch negative Eigenschaften – Nebel, Lichtbrechung und animierte Welleneffekte.

Also gehen wir Schritt für Schritt vor, besagte "Störfaktoren" zu beseitigen, angefangen mit den Welleneffekten. Diese werden über Normal- und Dudvmaps realisiert, die dazu auch noch animiert sind. Deswegen werden wir jeweils 2 neue Maps dieser Art erstellen, die ohne jeglichen Wellengang gemalt sind. Öffnet nun das Bildbearbeitungsprogramm eurer Wahl – ich kann z.B. Paint .Net 3.0 empfehlen.
Fangen wir mit der Normalmap an: Diese soll 512x512 groß sein und die Standardfarbe für Normalmaps haben. Diese hat den R G B Wert "128 128 255". In Paint .Net kann man dies über "Farben => Mehr" definieren. Speichert diese als 24-Bit TGA ab, am Besten mit dem Namen "spiegel_norm.tga". Jetzt kommt die dudv Map, diese ist in dem Fall unkomplizierter zu erstellen: Einfach dieselbe Größe (512 x 512) und mit "schwarz" ausfüllen. Um dem Tutorial korrekt folgen zu können, sollte sie den Namen "spiegel_dud.tga" haben. Wie man diese nun in "vtf" umwandelt, seht ihr in oben erwähnten Tutorials.
Das allein reicht allerdings noch lange nicht aus, um einen Spiegeleffekt zu erhalten. Sehen wir uns die VMT der Wasserdatei an:

 "Water"
{
	"%tooltexture" "dev/water_normal"
	"$refracttexture" "_rt_WaterRefraction"

	"$abovewater" 1
	
//	"$refracttint" "[0 0 0]"
//	"$reflecttint" "[1 1 0.9]"
	"$reflectamount" "7"
	
	"$cheapwaterstartdistance" "500"
	"$cheapwaterenddistance" "1000"
	
	
	"Water_DX90"
	{
		"$reflecttexture" "_rt_WaterReflection"
		"$reflectentities" 1
		"$refractamount" "1"
	}
	
	"Water_DX81"
	{
		"$refractamount" ".2"
	}
	
	"Water_DX80"
	{
		"$refractamount" ".2"
	}
	"Water_DX60"
	{
		"$fallbackmaterial" "liquids/water_dx70"
	}

	"$scale" "[.5 .5]"

	"$bumpmap" "dev/water_dudv"
	"$normalmap" "dev/water_normal"
	"$envmap" "env_cubemap"

	"%compilewater" 1
	"$surfaceprop" "water"
	"$bottommaterial" "dev/dev_waterbeneath2"
	"$bumpframe" "0"

	"$fogenable" 0
	"$fogcolor" "[.05 .05 0]"
//	"$fogcolor" "[.15 .1 0]"
	"$fogstart" 0
	"$fogend" 200

	"Proxies"
	{
		"AnimatedTexture"
		{
			"animatedtexturevar" "$normalmap"
			"animatedtextureframenumvar" "$bumpframe"
			"animatedtextureframerate" 16.00
		}

		"TextureScroll"
		{
			"texturescrollvar" "$bumptransform"
			"texturescrollrate" .01
			"texturescrollangle" 45.00
		}
		
		"WaterLOD"
		{
		}
	}
} 


Wir ändern einige Zeilen darin ab:

"%tooltexture" "dev/water_normal" => "%tooltexture" "custom/spiegel_norm"

Die Textur, die uns in der Texturvorschau im Hammereditor angezeigt wird.

"$refracttexture" "_rt_WaterRefraction" => // "$refracttexture" "_rt_WaterRefraction"

// steht in der Regel für eine Kommentarfunktion – der sich dahinter befindliche Code wird ignoriert. Genau das wollen wir erreichen: Damit entfernen wir die Textur für die Lichtbrechung.

// "$reflecttint" "[1 1 0.9]" => "$reflecttint" "[26 26 32]"

Gibt die Farbe der Reflexion an. 26 26 32 (RGB) hat sich hierbei als neutral herauskristallisiert.

"$reflectamount" "7" => "$reflectamount" "0.4"

Bestimmt die Intensität des Spiegelns – stellt nicht zu hohe Werte ein, ansonsten werden aus ungünstigen Blickwinkeln gerne noch Sachen gespiegelt, die man eigentlich nicht sehen möchte (in den anderen Raum z.B.).

"$refractamount" "1" => "$refractamount" "0" (Sowohl bei DX9, DX 8.1 und DX 8)

Dies gibt an, wie stark die Lichtbrechung sein sollte. Da wir vorhin den Texturpfad unkenntlich gemacht haben, würde eine Aktivierung der Refractions nur zu Grafikfehlern führen.

"$bumpmap" "dev/water_dudv" => "$bumpmap" "custom/spiegel_dud"
"$normalmap" "dev/water_normal" => "$normalmap" "custom/spiegel_norm"

Der Pfad der beiden Strukturtexturen.

"$fogstart" 0 => "$fogstart" 1024
"$fogend" 200 => "$fogend" 1024

Die Distanz des Nebels. Da "$fogenable" offenbar nicht greift, stellen wir die Distanz auf identische Werte – so „löscht“ er sich quasi selbst aus.

"animatedtexturevar" "$normalmap" => // "animatedtexturevar" "$normalmap"
"animatedtextureframenumvar" "$bumpframe" => // "animatedtextureframenumvar" "$bumpframe"
"animatedtextureframerate" 16.00 => // "animatedtextureframerate" 16.00 =>

Zum Schluss noch die Animierungsshader untauglich machen.
Aussehen sollte die modifzierte VMT dann so:

 "Water"
{
	"%tooltexture" "custom/spiegel_norm"
//	"$refracttexture" "_rt_WaterRefraction"

	"$abovewater" 1
	
//	"$refracttint" "[0 0 0]"
	"$reflecttint" "[26 26 32]"
	"$reflectamount" "0.4"
	
	"$cheapwaterstartdistance" "500"
	"$cheapwaterenddistance" "1000"
	
	
	"Water_DX90"
	{
		"$reflecttexture" "_rt_WaterReflection"
		"$reflectentities" 1
		"$refractamount" "0"
	}
	
	"Water_DX81"
	{
		"$refractamount" "0"
	}
	
	"Water_DX80"
	{
		"$refractamount" "0"
	}
	"Water_DX60"
	{
		"$fallbackmaterial" "liquids/water_dx70"
	}

	"$scale" "[.5 .5]"

	"$bumpmap" "custom/spiegel_dud"
	"$normalmap" "custom/spiegel_norm"
	"$envmap" "env_cubemap"

	"%compilewater" 1
	"$surfaceprop" "water"
	"$bottommaterial" "dev/dev_waterbeneath2"
	"$bumpframe" "0"

	"$fogenable" 0
	"$fogcolor" "[.05 .05 0]"
//	"$fogcolor" "[.15 .1 0]"
	"$fogstart" 1024
	"$fogend" 1024

	"Proxies"
	{
		"AnimatedTexture"
		{
		//	"animatedtexturevar" "$normalmap"
		//	"animatedtextureframenumvar" "$bumpframe"
		//	"animatedtextureframerate" 16.00
		}

		"TextureScroll"
		{
			"texturescrollvar" "$bumptransform"
			"texturescrollrate" .01
			"texturescrollangle" 45.00
		}
		
		"WaterLOD"
		{
		}
	}
}

Die sich im VTF-Format befindliche Normal- und Dudvmap kopieren wir in den custom/ Pfad. Ebenfalls kommt dort die modifzierte VMT Datei rein, die wir "spiegel_norm.vmt" nennen. Da das Spiegeln nicht transparent ist, müssen wir den Boden, der spiegeln soll, selbst durchsichtig machen und die modifizierte Wassertextur darunter legen. Damit der Floor durchsichtig ist, weisen wir ihm einen Alpha Channel mit den RGB Werten 137 137 137 zu. Es sollte min. 1 Unit Luft zwischen der Spiegeltextur und dem Boden sein, damit sich die Faces nicht gegenseitig auslöschen. Des Weiteren müssen die nicht sichtbaren Faces mit "NoDraw" belegt sein. Um Schönheitsfehler zu vermeiden, bauen wir unter die Spiegeltextur noch einen Brush mit einer "Standardtextur".

In dem Link findet ihr:

-Die modifzierte VMT
-Die Normal- und Dudvmap
-Eine Beispielmap (HL2 DM startpunkte)
-Eine floor Textur mit oben genanntem Alpha Channel.

Download der Beispielmap

Ich hoffe ich konnte euch weiterhelfen! :)