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

Anonymous

unregistriert

1

14.06.2004, 00:02

Modelle mit verschiedenen Tesxturen/Materialien

Hallo,

ich habe eine recht allgemeine Frage bezüglich Objekte in einem 3D Spiel, welche verschiedene TExturen oder sogar verschiedene Materialien benutzen sollen.

Zur Zeit habe ich es so gelöst, dass ich eine Model Klasse habe, welche z.B. nen Zeiger auf eine Texturresource besitzt, eben die Textur, die das Model benutzen soll. Wie soll man es jedoch nun machen, dass ein Model mehrere Texturen (/mehrere Materialien) besitzen kann? Klar, ich könnte natürlich eine Liste an Texturen in die Klasse bauen, aber wie render ich das bzw. wie merke ich mir, wann ich die 2. Textur setzen muss?

Es ist bei meiner Model Klasse so, dass die Vertexdaten für das Model alle in einem Vertexbuffer sind. Jetzt müsste ich es ja irgendwie hinbekommen, dass "ab dem 115. Vertex bitte eine andere Textur genommen werden soll" (dasselbe mit Materialien). Wie bekomme ich das hin, oder ist der Ansatz den ich hier verfolge falsch?

Ich könnte mir auch vorstellen, dass ich für jede Textur die ien Model benutzt auch nen eigenen Vertexbuffer verwende. So packe ich alle Vertices, die Textur 1 benutzen sollen, in den 1. Vertexbuffer usw...


Was wäre eine gute Vorgehensweise, bzw. kennt jemand eine bessere Lösung?


Vielen Dank!

Beste Grüsse,
Luke

2

14.06.2004, 02:26

Die Daten laden und beim Rendern abrufen und danach Rendern, quasi ne RenderList oder ModelArtList oder wie du es nennen willst.

3

14.06.2004, 11:40

Beide Lösungen sind gut und viel anders kann man es auch nicht machen. Wenn du nur einen VB haben willst, ist es das beste das deine Modellklasse intern eine Liste speichert:

Quellcode

1
2
3
4
5
6
7
8
struct MatEntry
{
    IMaterial* pMaterial;    // Material oder
    ITexture* pTexture;    // auch eine Textur

    int   iFirstVertex;    // Erster Vertex im VB
    int   iVertexCount; // Anzahl Vertice die das Material/Textur nutzen
};

Beim Rendern muss man nun nur noch die Liste durch gehen. Bei Bäumen ist diese Methode nicht mehr so gut zu gebrauchen, da ja nicht mit sicherheit gesagt werden kann welche Bereiche nun gerendert werden müssen. Dann muss man die Vertice erst so sortieren das man für das Modell immer nur einmal ein Material/Textur gesetzt wird.

Imho mach ich es so das pro Material/Textur immer ein VB gespeichert wird. Was aber auch am Design meiner Engine liegt.


Beide Methoden haben ihre Vor- und Nachteile. Zum einen hat ein VB den Vorteil das man weniger den VB wechseln muss, aber wenn man mit Bäumen arbeitet sind mehrere VB' pro Material/Textur angenehmer.
Die beste Methode ist es natürlich es zu verhindern das ein Modell mehrere Materialien/Texturen verwendet. Besonders bei z.B. Charackteren oder kleineren Gegenständen wie Waffen z.B. Bei Leveln läst es sich nicht vermeiden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

4

14.06.2004, 14:02

Hallo DragonMaster,

danke für Deine (wie immer) ausführliche Antwort, echt spitze wie oft Du den Leuten (und auch mir) schon geholfen hast.

Zitat


Imho mach ich es so das pro Material/Textur immer ein VB gespeichert wird. Was aber auch am Design meiner Engine liegt.


Ich denke ich werde das auch so angehen.. Irgendwie kam es mir zwar zunächst wie so ne Bruteforce Lösung vor, einfach für jede Textur bzw. Material nen eigenen VB anzulegen, aber Engine-Design Organisatorisch scheint das ja wirklich nicht schlecht zu sein.

Zitat


Die beste Methode ist es natürlich es zu verhindern das ein Modell mehrere Materialien/Texturen verwendet. Besonders bei z.B. Charackteren oder kleineren Gegenständen wie Waffen z.B. Bei Leveln läst es sich nicht vermeiden.


Ja stimmt, das liegt aber auch in der Verantwortung der Model-Designer, bzw. Content Produzenten... also is mir das jetzt erstmal egal :D

5

14.06.2004, 14:32

Zitat

Ja stimmt, das liegt aber auch in der Verantwortung der Model-Designer, bzw. Content Produzenten... also is mir das jetzt erstmal egal
lol :)

Wenn deine Engine nicht mehr erlaubt für einen Charackter, dann muss sich der Content Produzent und der Modell Designer eben was anderes einfallen lassen ;)

Naja, ganz so schlimm ist es ja nicht. Bei mir ergibt sich das weil ich keine ganzen Modelle rendern kann, sondern nur ein Mesh. Wobei die Meshes nach den Materialien/Texturen sortiert werden und dann werden nochmal die Meshes sortiert, so das ich nicht zweimal den selben VB setzen muss. Die Modelle sind da ein Level höher und enthalten Meshes mit ihren Materialien/Texturen. Das erleichtert vor allem das Handling von z.B. MD2 Modelle. Kopf, Torso und Beine sind jeweils ein Mesh und können daher auch jeweils eigene Materialien haben. Alles zusammen bildet dann das eigentliche Modell.

Die meisten machen es allerdings immer so das sie nur ein Modell rendern können. Dabei hat dann jedes Modell einen eigenen VB. Es wird also nicht zwischen Modell und Mesh unterschieden. Da ist es halt etwas einfacher zu sagen das pro Modell eben nur eine Textur zum einsatz kommen darf.
Das ist dann auch besser was die Performance angeht, da die meisten hier auch nicht weiter Sortieren.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige