Stadt-Textur erstellen
Übersicht

![]() |
MidimasterBetreff: Stadt-Textur erstellen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich helfe ja derzeit im TRAM Projekt von Phillip und Cedric mit und nun stellt sich uns die Frage, wie man den Untergrund einer kompletten Stadt erzeugen könnte. Bitte gebt uns mal Tipps wonach man hier im Forum suchen muss. Ich habe davon leider 0 Ahnung....
Der Untergrund soll alles enthalten, was normalerweise am Boden stattfindet: Straßen, Gehsteige, Rasenflächen, etc... Mit einer einzigen Textur ist sowas ja in der Größe einer Stadt nicht genau genug. Die Gehsteigkanten verschmieren. Ich hab aber schon Screenshots von Euch gesehen, wo selbst in riesigen Landschaften beim Blick zum Boden noch die Grashalme erkennbar sind. Wie geht sowas? Sollte so ein Straßennetz eine eigenes Mesh sein? Ich kann mir noch vorstellen, wie man den Gehsteig mit einer Asphalt-Textur überzieht...aber wie bekommt man Unterschiede (Pfützen, Flecken Gullis, etc...) in eine solche Textur? |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast dich wohl zu lange von den Traumvorstellungen umwickeln lassen... Eine riesige Stadt die man nicht in eine Textur bringt und wo man beim Blick zu Boden noch die einzelnen Grashalme erkennen kann?
Allein Für so n Straßen- und Vegetationsmodell würd ich mal ein bis 2 Monate Entwicklungszeit einplanen... Wenn ihr denn nichts besseres zu tun habt? mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die Textur für den Boden wird ständig wiederholt.
Eine für den Boden, eine für die Häuserwände usw. Stichwort Tiling. ( http://library.creativecow.net...tiling.php ) Da ich annehme das ihr nicht 100 eigene Häuser macht sondern ~20 die ihr wiederholt würde ich für jedes einzelnes Haus ein Mesh nehmen. So kann man weit entferntes ausblenden / LOD betreiben. ( http://de.wikipedia.org/wiki/Level_of_Detail ) Effekte sowie kleinere Props auch in eigene Meshes packen. Viel Erfolg ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ozzi789
Danke erstmal, dazu hab ich noch eine Frage: Das mit den Tiles ist mir so schon klar, aber wenn so ein Terrain doch nur eine Surface hat, wie wechsle ich dann (scharf) zwischen Asphalt und Gras? Daran scheitert es im Moment bei mir. Die Häuser werden wir erst mal simulieren. auf dem Bild sieht man auch gleich die unschönen Übergänge von Straße zu Sand Hier mal ein Screenshot vom momentanen Zustand des Simulators: übrigens mit einer Very-Low-Poly-Tram Sollen wir auch das Straßensystem (samt Gehsteigen, Gullis, etc...) in einem eigenen Mesh unterbringen? @Eingeproggt vielen dank für Deinen sachlichen Beitrag. Er hilft mir nun wirklich weiter.... Ich will in meinem Modell nicht die Grashalme erkennen... ich sah es nur schon bei Anderen. Das brachte ich mich auf die Idee, dass diese Genauigkeit auch bei Gehsteigkanten machbar sein muss. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für Gras/Bäume/Häuser in großen Mengen braucht man immer ein Single Surface System.
Fangt mit 10-Vertices Häusern (8 Quaderecken + 2 Dachkanten) an - dann kann's auch realistischer weise in realtime laufen. Midimaster hat Folgendes geschrieben: aber wie bekommt man Unterschiede (Pfützen, Flecken Gullis, etc...) in eine solche Textur? Gar nicht. Siehe oben: Implementiert etwas kleines, funktionierendes und arbeitet euch von da aus hoch.
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xeres hat Folgendes geschrieben: Für Gras/Bäume/Häuser in großen Mengen braucht man immer ein Single Surface System.
Fangt mit 10-Vertices Häusern (8 Quaderecken + 2 Dachkanten) an - dann kann's auch realistischer weise in realtime laufen. Midimaster hat Folgendes geschrieben: aber wie bekommt man Unterschiede (Pfützen, Flecken Gullis, etc...) in eine solche Textur? Gar nicht. Siehe oben: Implementiert etwas kleines, funktionierendes und arbeitet euch von da aus hoch.Naja ganz so ist es auch nicht, natürlich bekommt man zb Gullis einfach mit einem Grafikprogramm auf die Texturen oder erstellt für jedes Objekt ein Multi-Surface-Mesh, je eines für eine Textur und plaziert diese im Programm, das gleiche für Pfützen, Flecken etc. Das Alles zu einem Mesh zusammen geführt werden. Scharfe Abtrennungen bekommst du eigentlich nur durch Hochauflösende Texturen, UV-Mapping oder einzelne Meshes. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@xeres
für so ein SingleSurface System würdest du dann die UV Koordinaten so setzen, dass die richtige Textur auf das richtige Triangle kommt? Entschuldige solch dämliche Fragen, aber das ist echt Neuland für mich.... Gleich noch eine Frage zu den UVs: Bräuchte man nicht eigentlich immer mehrere UVs an einem Vertex, z.b. dann, wenn dort mehrere Texturen zusammenstoßen? Das von dir angeratene "Kleine" läuft nun eigentlich schon (siehe Bilder oben). Wir haben die Polys im Griff und die Performance ist traumhaft. Selbst auf meinem Uralt-Notebook unter 30% bei 6oFPS. Wir sind nun schon beim nächsten Schritt und wollen es etwas professioneller aussehen lassen. @skey-z Ah! Danke, das hört sich vielversprechend an. Ich werde mal gleich zu Multi-Surface-Mesh und UV-Mapping nach einem Tutorial suchen |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, richtig, man muss die UV Koordinaten setzten.
Zitat: Bräuchte man nicht eigentlich immer mehrere UVs an einem Vertex, z.b. dann, wenn dort mehrere Texturen zusammenstoßen? Darum hat ein Cube tatsächlich 4 Vertices per Seite:
BlitzBasic: [AUSKLAPPEN] Local cube=CreateCube()Die zusätzliche Vertices sollten aber kein zu großes Problem sein, solange die Surface-Zahl minimiert wird. Ob und wie Multitexturing damit funktioniert, kann ich so nicht sagen, habe ich nie probiert. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Funktioniert eigentlich genau wie Single-Surface, ich weiß nicht, ob es da Tutorials gibt, habe eben nur das Single durch Multi ausgetauscht, du kannst ja einem Mesh mehrere Surfaces hinzufügen und jedem Surface eine Textur zuweisen.
Für Einfache Objekte brauchst du ja auch nur 6 Vertices, also 2 Polys, die ein Quadrat/Rechteck ergeben, da ein Textur, wahlweise mit Alpha drauf, UV-Koordinaten richtig gesetzt und zum Surface hinzufügen. Bei Prützen un ähnlichem wird es etwas schwieriger, da bräuchtest du vielleicht noch zusetzlich Reflektionen und Bumpmapping. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich hab da grad mal ein bißchen nachgelesen.
Ein Multi-Surface-Mesh ist, so wie ich das rauslese, fast genauso als wenn es mehrere Meshes sind. Was ist der Vorteil, wenn ich nur 1 Mesh verwende? Heisst das nun für mich, ich werde die Straßen als Mesh erstellen und der erhält eine Surface, dann hänge ich an die Straßenränder den Gesteig an , der dann eine eigene Surface bekommt. So erhalte ich scharfe Kanten und so sind auch Rinnsteine möglich? Würdet ihr sowas softwaremäßig durch einen Algo lösen, oder in einem CAD Programm erstellen? @Xeres Multi-Texturing? Da suche ich mal in den Tuts.... das war ein aufschlussreiches Beispiel. Bisher ging ich immer davon aus, das ja pro ecke nur 1 Vertex sein darf. Aber so wie du das zeigst. Kann die Surface mehrere Vertices an der gleichen Stelle haben und die haben dann unterschiedliche UVs. Eigentlich logisch! Danke @skey-z leider gibt es keine Tuts zu diesem Thema! Wäre ja mal eine Gelegenheit für mich wieder mal ein Tutorial zu schreiben... Ihr gebt das Wissen dazu und ich formulier es so, dass auch Total-Newbies verstehen werden. Jetzt wird es spannend, dazu hab ich gleich mehrere Fragen: Zitat: ... da ein Textur, wahlweise mit Alpha drauf, UV-Koordinaten richtig gesetzt und zum Surface hinzufügen....
ich dachte immer, eine Textur kann nur auf 1 Surface? Und die Vertices müssen zuerst in die Surface hinzugefügt werden und anschießend wird der Surface eine Textur zugeordnet? Wie mache ich es, dass eine bestimmtes Triangle eine eigene Textur bekommt und trotzdem Teil einer gemeinsamen Surface wird? Verstehe ich das richtig: Die Textur-Bildvorlage kann auch mehrere "Texturen" enthalten und durch die korrekte Zuordnung von UVs wird dann der entsprechende Bildausschnitt zur Textur eines best. Triangles? |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine letzte Frage kann man mit einem eindeutigen Ja beantworten. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also sowas wie Gullis und Pfützen würde ich über Quads oder Sprites realisieren. Einfach etwas über der Straße schweben lassen, fällt keinem auf. Bei großen flächen, wie z.B. Wiesen macht es sich auch immer gut, eine zweite Textur via Multitexturing drüberzubügeln, schön gestreckt, um den Textukachel-Effekt zu kaschieren.
Für detailreiche Texturen würde ich die Stadt bzw. nur die Oberfläche in Quadrate zerschneiden, dafür müsste wahrscheinlich aber ein eigener Leveleditor her, der das Texturieren übernimmt und alles automatisch zerschnippelt. Hierbei gibt es aber noch das Problem des fehlenden Multithreadings in B3D, irgendwie müssen ja die einzelnen Teile mit ihren Texturen verwaltet werden. Je nach Grafikspeichergröße müssen die detaillierten Texturen aus entfernten Stückchen der Welt durch niedrig aufgelöste ersetzt werden und Detailobjekte wie Gullis entfernt werden, und umgedreht bei nahen Stückchen. Keine Ahnung, ob man das ohne Threading ruckelfrei hinbekommt. Und zwischendurch immer schön aufregen, dass es nicht so funktioniert wie gewollt ![]() |
||
Starfare: Worklog, Website (download) |
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: wenn so ein Terrain doch nur eine Surface hat, wie wechsle ich dann (scharf) zwischen Asphalt und Gras? Daran scheitert es im Moment bei mir. Die Häuser werden wir erst mal simulieren. auf dem Bild sieht man auch gleich die unschönen Übergänge von Straße zu Sand Die bisher geleisteten Tipps hier sind für mich etwas zu allgemein und am Problem vorbei geschossen oder für mich zu kompliziert erklärt. Das gezeigte Problem lässt sich dadurch lösen, dass Asphalt und Rasen im Model durch Edges voneinander getrennt sind, sodass man den Faces dann entsprechend separate Texturen zuweisen kann, oder eben per UVs separate Bereiche aus einer großen Textur wenn man unbedingt alles in eine packen möchte. EDIT: Während des Schreibens sind einige Beiträge schon schneller gewesen als ich ![]() |
||
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller Nothing more to register - you've cleaned us out![/size] |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: @skey-z leider gibt es keine Tuts zu diesem Thema! Wäre ja mal eine Gelegenheit für mich wieder mal ein Tutorial zu schreiben... Ihr gebt das Wissen dazu und ich formulier es so, dass auch Total-Newbies verstehen werden. Jetzt wird es spannend, dazu hab ich gleich mehrere Fragen: Zitat: ... da ein Textur, wahlweise mit Alpha drauf, UV-Koordinaten richtig gesetzt und zum Surface hinzufügen....
ich dachte immer, eine Textur kann nur auf 1 Surface? Und die Vertices müssen zuerst in die Surface hinzugefügt werden und anschießend wird der Surface eine Textur zugeordnet? Wie mache ich es, dass eine bestimmtes Triangle eine eigene Textur bekommt und trotzdem Teil einer gemeinsamen Surface wird? Verstehe ich das richtig: Die Textur-Bildvorlage kann auch mehrere "Texturen" enthalten und durch die korrekte Zuordnung von UVs wird dann der entsprechende Bildausschnitt zur Textur eines best. Triangles? Also zu 1. Zum Versändnis, du kannst mit jedem Mesh oder Surface auf jede Texur zugreifen Entitytexture ![]() Allerdings kann ein Surface, also Oberfläche in einem Mesh nur eine Textur haben, wobei ein Mesh mehrere Surfaces aufnehmen kann siehe LoadAnimMesh ![]() ![]() Um ein Triangle zu texturieren, musst du ja den Vertices entsprechende UV-Koordinaten angeben, damit sagst du dem Vertex, an welcher Position(x,y) es in der Textur gesetzt wird. Du kannst auch Gullis, Pfützen und Flecken alle in eine Textur und ein Surface packen, aber wenn auf die verschiedenen Objekte andere Effekte angewendet werden sollen, zB Reflektion auf Pfützen, kannst du bei verschiedenen Surfaces beim Laden mit LoadAnimMesh und Findchild die Effekte nur auf die Pfützen anwenden, alle weiteren Childs wie Gullideckel bleiben unberührt. [Edit] Du könntest auch jedes Objekt in ein Mesh als Single-Surface packen, jedoch solltest du die Straße mal verschieben müssen, musst du dann auch jedes Mesh separat verschieben, so wie beschrieben, verschiebt du das Elternelement und alles bewegt sich mit und bleibt an der gewünschten Stelle [/Edit] |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, vieles wurde schon im Thread gesagt, aber ein wenig zur Aufklärung:
Meshes enthalten beliebig viele Surfaces. Jeder Surface wird ein Stack von Texturen zugeordnet mit maximal acht Texturen drauf. Nur die Surface selbst enthält tatsächlich Geometriedaten. Sie besitzt jeweils einen Vertexbuffer und einen Indexbuffer. Im Vertexbuffer werden Vertexdaten (XYZ, RGBA, Normalen-XYZ sowie zwei Sets UV-Koordinaten) gespeichert. Der Indexbuffer enthält die Dreiecke, bzw. jeweils drei aufeinanderfolgende Indizes von den drei Eckpunkten des Dreieckes im Vertexbuffer. Den Textur-Stack benutzt man für Multitexturing. Wenn man EntityTexture ![]() Welche Technik beim Verschmelzen benutzt wird, kannst du mit TextureBlend ![]() Über UV-Koordinaten: Jeder Vertex besitzt Texturkoordinaten, die angeben, welcher Teil der Textur an diesem Punkt auftaucht. Die UV-Koordinaten sind im Bereich von 0-1 (nicht in Pixeln) und werden innerhalb des Dreiecks interpoliert, d.h. in der Mitte des Dreiecks zum Beispiel haben die Texturkoordinaten aller drei Vertices einen Einfluss darauf, welches Pixel der Textur dort zu liegen kommt. Wie es so ist, haben Vertices in B3D zwei UV-Koordinatenpaare zur Verfügung. Diese kann man separat setzen; ausserdem kann man mithilfe von TextureCoords ![]() Das klingt jetzt erst verwirrend - wofür braucht man denn zwei Koordinatenpaare? Es geht primär um Multitexturing - es kommt manchmal vor, dass man zwei verschiedene Texturen auf einem Mesh haben will, aber nicht beide die gleichen Texturkoordinaten verwenden soll. Ein Beispiel ist Noocraft, wo Block-Textur und Ambient-Occlusion-Textur beide auf der gleichen Surface lagen, aber verschiedene Koordinaten verwendet werdet mussten (Block-Textur je nach Blocktyp und AO-Textur je nach umliegender Blockkonstellation). UV-Koordinaten kann man für einfache geometrische Formen oder für prozedurale Landschaften noch einigermassen von Hand berechnen, aber für kompliziertere Modelle sollte man definitiv dafür geschaffene Programme verwenden. Über Performance: Jede Surface stellt einen separaten Drawcall an die Grafikkarte dar. Jeder Drawcall bedeutet einen relativen Overhead (CPU -> GPU Kommunikation etc). Danach skaliert der Zeitaufwand mit der Anzahl Polygonen. Was das heisst: Wo möglich, viele Surfaces vermeiden. Ein gutes Beispiel sind Sprites oder ähnliches, die sehr wenige Polygone haben, aber dafür pro Sprite eine zusätzliche Surface bedeuten. Daher ist es vor allem bei Sprites, die alle die gleiche Textur verwenden (z.B. Partikel), sehr wichtig, diese in eine einzige Surface zu packen ("Single surface"). Allerdings ist es eher eine schlechte Idee, um jeden Preis die Anzahl Surfaces zu verringern, wenn es dafür grossen Overhead auf der CPU oder sehr grosse Texturen bedeutet. Overhead auf der CPU für Geometriedaten ist immer eine schlechte Idee, da die GPU immer noch sehr schnell ist und zudem parallel zur CPU arbeitet - je länger aber sie pro Frame auf Geometriedaten warten muss, weil man die noch auf der CPU herumschieben muss, um die Surfaceanzahl zu verringern, umso schlechter die Performance. Gleiches gilt für Texturen - kleinere Texturen werden auf der GPU besser gecached und sind darum schneller (obwohl neuere Grafikkarten ziemlich grosse Caches haben). Wenn man also eine Surface einsparen kann, aber dafür Texturgrösse verdoppeln muss, sollte man das lieber unterlassen. Ein letzter Tipp beim abwägen der Surfaceanzahl ist Meshgrösse. Ein Mesh wird erst verarbeitet, wenn dessen Boundingbox im Sichtfeld liegt (Optimierung von B3D). Wenn man sich also dazu entscheidet, Polygone, die überall auf der Map verteilt sind, in eine Surface zu packen, heisst dass, dass jedes Frame die ganze Geometrie dessen verarbeitet wird, obwohl nur ein Bruchteil (oder vielleicht auch gar nichts) davon sichtbar ist. Man sollte Geometrie also nur in lokal begrenzten Bereichen in ein Mesh packen. Was deine Frage von verwaschenen Texturen angeht: Im Beispiel des Übergangs von Strasse zu Sand würde ich einfach einen zusätzlichen rechteckigen Streifen einfügen und dort die Textur eines Strasse-Sand-Übergangs einfügen, welcher dann ohne Probleme höher aufgelöst wird. Man sollte sich nicht zu viele Gedanken um das einsparen von Polygonen machen - Grafikkarten (selbst integrierte) sind heute sehr sehr gut darin, Dreiecke schnell zu rendern. Ob nun also hundert Dreiecke mehr oder weniger macht den Braten nicht fett, kann aber sehr schnell den Eindruck einer Szene verändern. Wenn du also Polygone einsparen willst, mach dir lieber Gedanken um LOD, um Modelle je nach Entfernung durch niedriger aufgelöste Meshes zu ersetzen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
vielen Dank für Euere vielen Antworten. Jetzt sehe ich schon klarer, wie es weitergehen sollte...
Auffallend ist, dass es zu diesem Thema kaum Tutorials gibt. Zwar gibt es jede Menge Tutorials, die die Befehle vorstellen, doch leider kaum welche, die eine Art "Strategie" bei der Erstellung von 3D-Städten aufzeigen. Für Fragen wie Optimierung der Anzahl von Meshes/Surfaces oder die Optimierung der Darstellungsschärfe finden sich keine Antworten unter den Tutorials. Sogar so harmlose Dinge wie das sinnvolle Nutzen der UV-Koordinaten werden kaum erklärt. Möglicherweise lasse ich hier mal meine Anfänger-Erfahrungen in ein Tutorial fliessen, bevor ich so viel Routine habe, dass ich mich an die Anfängersorgen nicht mehr erinnere... Spätestens beim Licht werde ich mich wieder an Euch wenden. Das ist nämlich mein zweites "Sorgenkind" |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group