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

1

16.11.2008, 09:24

Textur-Splatting oder doch etwas anderes?

Hi! Ich habe nun 2 verschiedene Arten des Terrain renderings ausprobiert.

1. Textur-Splatting:
Ich habe 5 Verschiedene Texturen auf dem Terrain, Grundfläche(Erde), Gras, Stein, Laub und Steine. Außerdem existiert eine Colormap, die allen Texturen den nötigen Alphawert giebt, bis auf der Grundtextur. Die Texturen werden dann zur Laufzeig der Reihe nach zusammen gemischt, abhängig vom Alphawert aus der Textur.

2. Große Texturen:
Für jeden Patch in dem Terrain (64x64 pixel) existiert ein Bild, welches dann einfach über das gesammte Quad gezogen wird.

Nun frage ich mich, warum man Splatting so häufig benutzt? Ich habe ja schließlich eine Colormap die so groß ist wie der ganze Patch, und hat somit auch die selbe größe wie als wenn ich gleich eine fertige Map drüber pflanze. Und ich muss auch noch viel weniger berechnen.

Ich versuche schon zu lange dahinter zu kommen, doch irgent wie will das nicht in meinen Kopf rein. Habe ich das prinziep vom Texture-Splatting falsch verstanden, oder benutzt man für Terrains doch besser ganz andere Methoden. Mch interessiert das Mega-Texturing verfahren, von id-soft, aber im Internet habe ich dazu lediglich 2 Artikel dazu gefunden die wie ich finde nicht genug preis geben um dies zu verstehen. So wie ich das verstanden habe, hat man eine riesige Textur, aus der wiederum kleinere Teile gemacht werden, und Patches des Terrains welche weiter entfährnt sind, bekommen eine geringer aufgelösten teil der Textur. Nun frage ich mich, wie man das denn nun hinbekommt, die texturen während der laufzeit zu scalieren, das ist doch viel zu rechenintensiv!

2

16.11.2008, 09:36

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=10123&postdays=0&postorder=asc&start=0

Kannst du dich noch entfährnt daran erinnern?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

16.11.2008, 09:40

Re: Textur-Splatting oder doch etwas anderes?

Zitat von »"Dustin Braun"«

Nun frage ich mich, wie man das denn nun hinbekommt, die texturen während der laufzeit zu scalieren, das ist doch viel zu rechenintensiv!

Genau da liegt der Vorteil von der ersten Methode. Mittels Texturkoordinaten kannst du verdammt flott die Texturen skalieren. Deine Grastextur kann winzige 128x128 pixel haben, wird aber über das Quad einige male wiederholt. So sieht die Textur scharf aus, trotz ihrer kleinen Größe. Die Alphamap braucht dann keine all zu große Auflösung, sie bestimmt ja nur wo von welcher Textur am meisten zu sehen ist.

Bei einer großen Textur brauchst du eben ziemlich große Auflösungen, sonst sieht das Terrain verwaschen aus.

Ich weiß nicht wie das heutzutage aussieht, aber ich glaube gelesen zu haben, dass die erste Methode heute, dank moderner Grafikkarten, eigentlich nicht mehr nötig ist.

Nachtrag: Ein kleiner Vorteil der ersten Methode ist die einfache Implementierung von realtime terrain editing. Du kannst mit dem "pinsel" einfach in die Alphamap zeichnen und musst nicht nach jedem Schritt die komplette Textur neu berechnen.

4

16.11.2008, 09:56

Zitat

Kannst du dich noch entfährnt daran erinnern?


Ich wollte den alten Post nicht nocheinmal ausgraben.

Mit dem Scalieren meinte ich eigentlich das Eine textur die 1024x1024 groß ist, auf 128x128 runter scaliert wird, damit meine ich das sie dann auch wirklich 128x128 groß ist, und nicht nur in der größe gezeichnet wird.

Zitat

Die Alphamap braucht dann keine all zu große Auflösung, sie bestimmt ja nur wo von welcher Textur am meisten zu sehen ist.


Dann ist das blending doch total verpixelt?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

5

16.11.2008, 10:22

Das Blending ist verwaschen, aber das ist wurscht so lange die Texturen scharf sind.

6

18.11.2008, 00:06

Ich habe mir mal die ganzen Kmerziellen Spiele angeschaut und versucht heraus zu bekommen, wie die das so machen, natürlich habe ich dazu mein lieblingspiel Guildwars genommen.

http://www.pcmasters.de/pics/Compilers/GuildWars1.jpg
http://www.schmitzchen.org/uploaded_images/Gw_Siedlungen1-777734.jpg
http://www.zurro-gaming.de/marcs-dateien/gw057.jpg

Mir ist aufgefallen, das sie immer nur 5 verschiedene terrain texturen auf einer ebene haben, und diese werden immer miteinander geblendet.

Ich vermute, das sie eine Grundtextur haben, und 4 weitere (gras, sand etc). Außerdem dann noch eine Colormap, die bei einem 64x64 Patch auch 64x64 Pixe hat, immer ein pixel für ein Quad. Dann texturieren sie einfach an diesen quads nur so viel einer textur, wie auch von deren farbe in der colormap an dieser position vorhanden ist. Wenn dann zwi unterschiedliche texturen nebeneinander sind, werden dieseeinfach geblendet. Ich würde das gerne auch so hin bekommen, doch meine shader kenntnisse sind dafür doch noch sehr eingeschrängt.

Aber so könnte man das ja machen :)

7

18.11.2008, 00:16

Naja, mein erster "gescheiter" Shader war halt auch einer, der aus 4 Texturen einen Boden macht. Eine Alphamap, von der ich die 3 Farbkanäle benutze um quasi 3 Alphamaps mit Werten von 0 bis 255 zu speichern, sowie die 3 Texturen, die anhand der Alphamap zusammen gemischt werden.

Den jetzt zu posten bringt glaub ich wenig, man muss so einen Shader ja eh immer noch ein wenig anpassen und es ist wirklich ein ziemlich einfacher Shader.
Schön erweitern kann man das natürlich, indem man z.B. 5 Bodentexturen nimmt, eine die man sieht, wenn die Alphamap überall 0 ist und dann eben noch den Alphakanal der Alphamap als 4te Alphamap benutzt. Mit Multipassrendering oder eben zusätzlichen Alphatexturen kann man dann quasi beliebig viele Bodentexturen ganz bequem ineinander blenden.
Ganz abgesehen davon, dass man natürlich den Boden in mehrere Bereiche einteilen kann, die jeweils eine Alphamap und dann noch 3-5 individuelle Bodentexturen haben, man hat ja selten Bereiche, wo man wirklcih mehr als 5 Bodentexturen braucht.
Lieber dumm fragen, als dumm bleiben!

8

18.11.2008, 00:59

Jop! Alos, ich verstehe das rinziep von shadern noch nicht so wirklich, und mache gerade die Riemer und Xna.map tutorials durch, da geht es zwar um XNA (C#), aber HLSL ist dort trotzdem gleich^^

Das schwere ist jan nicht das draufappen, und blenden an sich, sondern das ein dreicek sich mit einem andren blendet, wenn dort eine andere texture ist.

Aber das wird schon noch :)

9

18.11.2008, 05:29

So, ich habe nun meinen ersten selbst geschriebenen und nützlichen Shader fertig, bzw fast fertig. Den muss ich natürlich zeigen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
float4x4 xViewProjection;
Texture xGround;
Texture xRed;
Texture xGreen;
Texture xBlue;
Texture xAlpha;
Texture xMap;

sampler sGround = sampler_state { texture = <xGround> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
sampler sRed = sampler_state { texture = <xRed> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
sampler sGreen = sampler_state { texture = <xGreen> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
sampler sBlue = sampler_state { texture = <xBlue> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
sampler sAlpha = sampler_state { texture = <xAlpha> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
sampler sMap = sampler_state { texture = <xMap> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};


struct VertexToPixel
{
    float4 Position     : POSITION;    
    float2 TexCoords    : TEXCOORD0;

};

struct PixelToFrame
{
    float4 Color        : COLOR0;
};


VertexToPixel VS( float4 inPos : POSITION, float2 inTexCoords : TEXCOORD0)

{
    VertexToPixel Output = (VertexToPixel)0;
    Output.Position = mul(inPos, xViewProjection);
    Output.TexCoords = inTexCoords;

    return Output;
}

PixelToFrame PS(VertexToPixel In)
{
    PixelToFrame Output = (PixelToFrame)0;  

    float4 map = tex2D(sMap, In.TexCoords / 64);
    //Output.Color  = tex2D(sGround, In.TexCoords);

    Output.Color += tex2D(sRed, In.TexCoords) * map.r;
    Output.Color += tex2D(sGreen, In.TexCoords) * map.g;
    Output.Color += tex2D(sBlue, In.TexCoords) * map.b;
    Output.Color += tex2D(sAlpha, In.TexCoords) * map.a;

    return Output;
}

technique Splatting
{
    pass Pass0
    {
        VertexShader = compile vs_1_1 VS();
        PixelShader = compile ps_2_0 PS();
    }
}


Also, es ist möglich 5 verschiedene Texturen in dem Shader zu zeichnen, setzt natürlich PixelShader 2.0 voraus! 2 Texturen sind noch frei, die können nun für bumpmaps oder sonstwas benutzt werden. Leider funktioniert er noch nicht ganz so wie er soll. Die Farben werden immer hinzu addiert, und das setzt voraus, das alle RGB Werte zusammen 1.0 ergeben. Wenn man nun aber zwei texturen gleichzeitig gleichstark zusammen mischen möchte, wird die stelle sehr weiß, und das möchte ich vermeiden. Ich könnte ja nun einfach die werte immer normalizieren, aber da müsste es doch bestimmt nch eine besserer möglichkeit geben! Naja, ich werd mal weiter daran experimenteiren.

Achja, ihr hattet recht, obwohl ich keinen weirklichen verlaf drin habe, sieht man man die unterschiede garnicht, es sieht aus als würden sie in einander verlaufen, sehr merkwürdig ... Aber warscheinlich liegt es daran das ich eine 512x512 große colormap für 63x63 Quads benutze^^

Werbeanzeige