Frage

Wie bewähren sich Computerspiele?Ich werde eine Höhenkarte für die Geometrie verwenden (obwohl ich sie später optimieren werde), aber ich frage mich, was die beste Technik ist, um beispielsweise meinen Boden zu „bemalen“;Gras fast überall, hier und da Feldwege, Kies in den Städten und fließende Übergänge zwischen den einzelnen Materialarten.

Verwende ich einfach eine große vorgebackene Textur?Das scheint sehr ineffizient zu sein, wenn ich vorhandene Texturen kacheln könnte.Verwende ich dann für jede vorhandene Textur eine große Alpha-Map?Theoretisch klingt es für mich in Ordnung, aber wie mache ich das eigentlich und was sind die Konsequenzen?Ich weiß wirklich nicht, wo ich anfangen soll, und meine Google-Suchen erweisen sich als nicht sehr effektiv.

Ich möchte die Textur lieber nicht am Raster „einrasten“ lassen (d. h.Raum (0,0) ist Gras, Raum (0,2) ist Schmutz, Raum (0,1) ist Gras-Erd-Übergang);Ich würde lieber willkürlich malen können, damit es überzeugender aussieht.Natürlich wäre das der einfache Weg, aber es bedeutet zu große Einbußen bei der Grafikqualität und dem „Realismus“.

Ich suche hier hauptsächlich nur nach Theorie und Optionen.Ich verwende OpenGL. Wenn Sie also Tipps zur Arbeitsweise von OpenGL und zu Funktionen geben könnten, von denen ich vielleicht noch nie gehört habe, wäre das großartig.

Nur zur Klarstellung: Oblivion ist eine gute Referenz für das, was ich suche.Ich weiß nicht, wie die Geometrie des Bodens ist (Höhenkarte, statische 3D-Modelle usw.), aber ihr Gelände hat unterschiedliche Bodentypen und fließende Übergänge zwischen ihnen, wie ich es erwähnt habe.Hier ist ein Beispielbild. Beachten Sie, wie das Kopfsteinpflaster unrealistisch, aber reibungslos in das Gras übergeht: http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

Ich glaube auch, dass ich darüber in einem der Game Programming Gems-Bücher gelesen habe, aber ich habe dem damals nicht viel Aufmerksamkeit geschenkt, und jetzt, da es Sommer ist, habe ich keinen Zugang zur Bibliothek meiner Universität, um nachzuschauen!Ich suche gerade nach Inhaltsverzeichnissen und werde sie bearbeiten, wenn ich sie finde, aber ich werde es immer noch nicht vor Mitte August lesen können.

BEARBEITEN:Ah Mann, Game Programming Gems 7 hat ein Kapitel 5.8 mit dem Titel „Mapping Large Textures for Outdoor Terrain Rendering“, das klingt nach genau dem, was ich brauche, aber in der Bibliothek meiner U gibt es nicht einmal dieses Buch!In den anderen Game Programming Gems-Büchern konnte ich nichts Genaues in dieser Art finden, obwohl einige Artikel über Geländegeometrie enthielten.

War es hilfreich?

Lösung

Ich habe vor kurzem ein kleines Terrain-Rendering-Engine in OpenGL geschrieben, dass etwas ähnliches tut, was Sie reden. Die Technik, die ich verwende, wird am besten beschrieben als Textur splatting .

Ich verwende fünf Texturen dies zu erreichen. Vier dieser Texturen sind Detail-Texturen: Gras, Felsen, Wasser und Sand. Diese Texturen sind eher klein, 512x512 Texturen, und sie sind über das Gelände gefliest. Die fünfte Textur ist ein mixmap. Die mixmap ist eine riesige Textur, die das gesamte Gelände umfasst, in meinem Fall 4096x4096 ist.

MixMap

Dieses mixmap verwendet alle 4 Farbkanäle (r, g, b, a) zu beschreiben, wie viel von einem Detail Textur an dieser bestimmten Stelle anzuzeigen. Ich bin mit dem roten Farbkanal zu bestimmen, wie undurchsichtig ist der Sand, grün für Gras, blau für Wasser ist, und Alpha ist für Rock. Diese mixmap basierte berechnet aus der heightmap bei der Initialisierung und ich verwende Höhen, diese Werte zu bestimmen. Zum Beispiel, in der Nähe der Meereshöhe, möchte ich vor allem Wasser, so dass ich einen hohen Wert in dem blauen Kanal und niedrigen Werten in den anderen Kanälen. Wie ich höher in die Berge zu bekommen, habe ich den Alpha-Farbkanal auf einen hohen Wert, da ich eine Menge Rock-Textur will, aber ich setzte alle anderen Farbkanäle auf niedrigere Werte.

Fragment Shader

Dieses mixmap wird dann in den Fragment-Shader zum Einsatz, wo ich diese Farbkanäle des mixmap nehmen und nutzen sie das Detail Texturen zu kombinieren. Hier ist der GLSL Code, den ich für das Fragment-Shader bin mit:

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

Die einheitliche texscale ist ein Wert, der die Detailtexturen bestimmt, wie oft sind über das Gelände gefliest. Höhere Werte werden die Detail-Texturen auf die Gefahr knackig aussehen machen machen sie mehr repetitious aussehen.

Andere Tipps

Vorbacken ist sicherlich nicht ineffizient. es ist das effizienteste in der Tat, weil Ihr Runtime-Code keine Vermischung oder andere Berechnungen zu tun hat. es macht nur die Textur. Natürlich bieten die dynamischen Techniken eine Vereinfachung des Werkzeugkette und mehr Optionen.

ID scheint die einzige große „Megatextur“ (wir reden 32K ^ 2-128K ^ 2) arbeiten in QuakeWars.

Es gibt eine interessante Q & A mit Carmack darüber bei

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(Original-Link scheint zur Zeit tot, aber nicht nicht über einen Link zu machen, weil scheint Probleme mit Internet Archive Links zu haben, sie sehen gut aus in der Bearbeitungs Vorschau, dann brechen auf der Hauptseite).

Eine der Standardmethoden, die beispielsweise in der Source(hl2)-Engine verwendet wird, besteht darin, ein Alpha pro Scheitelpunkt zu haben, um zwei Materialien zu vermischen.Die Materialien bestehen in der Regel mindestens aus einer Albedo- und einer Normalkarte.In der Quell-Engine sind nur 2 Materialien pro „Mischtextur“-Material erlaubt, was ziemlich beschissen ist.

Wenn Sie mehr als zwei Materialien wünschen, müssen Sie dies simulieren, indem Sie verschiedene Verschiebungen mit unterschiedlichen Texturen texturieren. Dabei müssen Sie sicherstellen, dass jede einzelne Kachel höchstens zwei Materialien enthält.

Ein Alpha pro Scheitelpunkt statt pro Pixel sieht ziemlich schlecht aus.Wie Sie in Oblivion bemerkt haben, gibt es beispielsweise Kopfsteinpflaster, das nahtlos in den Sand übergeht.Es gibt eine Lösung für diesen Fehler;Sie verwenden eine andere Textur, die das Alpha pro Pixel moduliert, sodass sich die Risse zwischen den Kopfsteinpflastersteinen leicht mit Sand füllen, die Oberseiten der Kopfsteinpflastersteine ​​jedoch bei fast 1,0 Alpha bleiben, bis das interpolierte Scheitelpunkt-Alpha für das Kopfsteinpflaster fast 0 ist Material.Dadurch kann der Übergang wirklich schön aussehen und nicht nur ein hässlicher Fleck sein.

Sie können auch eine Textur mit niedriger Auflösung verwenden, die die Alphas enthält (aber immer noch viel höher als 1 Alpha pro Scheitelpunkt).Die gekachelten Terrain-Texturen können eine Größe von 2048 x 2048 haben, aber die Textur, mit der sie zusammengefügt werden, benötigt keine Auflösung pro Texel.Eine 256x256 8-Bit-pro-Texel-Textur ist mit Mip-Maps nur 96 kB groß.

Im Allgemeinen Übergangsbereiche sind precreated, obwohl es möglich ist, einige Dinge mit Alpha-Kanälen und Mischen von Texturen zu tun.

Sie kann nicht von Fliesen weglaufen, aber vielleicht, wenn Sie eine Basistextur verwenden, die ein wenig Lärm auf dem Boden macht, sieht es aus wie es keine Kacheln ist ...

Verwendung Basistextur mit den gleichen Texturkoordinaten von Alpha-Textur. Basistextur kann alles .. ein Satellitenbild oder eine Grasbeschaffenheit sein .. es wäre perfekt passen, wenn es zu einem Boden Form zusammenhängt ..

und versuchen nahtlose Texturen zu verwenden für Ihr Gras, Felsen Texturen ... es löst nicht, sondern macht es aussieht, als es kein Problem

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top