ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Tiro)
Kommentare (8)
*****

Weitere
User onlineBenutzer online
Gäste online: 8
Mitglieder online: Glatzemann
Registrierte Mitglieder: 1040
Neustes Mitglied: Fantoma5

Problem: Mesh mit mehreren Materialien richtig Rendern

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 18:42    Titel: Problem: Mesh mit mehreren Materialien richtig Rendern

Hi,

ich habe vor ein Cinema 4D Plugin mit der von Cinema eigenen Programmiersprache COFFEE zu programmieren, um die Szene oder einzelne Meshes korrekt zu exportieren und in XNA zu importieren (wahrscheinlich wird demnächst ein Userprojekt im Forum erscheinen).
Nun habe ich aber folgenes Problem, Cinemas Materialsystem zwingt mich dazu ein Meshobjekt in mehrere Teilmeshes umzuwandeln, wenn ein Mesh mehrere Materialien benutzt. Dann habe ich mir vorgestellt, dass ich einfach die Teilmeshes nacheinander rendere, schnell wurde mir klar, dass das nicht einfach geht, wenn der Z-Buffer deaktiviert ist, sonst würde einfach das gerendete Teilmesh das davor gehende "übermalen" und mir ist klar, dass der Z-Buffer bei vielen Vertices die Performance verschlinkt. Wie kann ich das verhindern und wie haben die Entwickler von XNA dieses Problem gelöst?

Danke für eure schnelle und zuverlässige Hilfe!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 19:01    Titel:

Genauso wie alle anderen auch Smile

Erstmal der Z-Buffer verschlingt keine Performance bei vielen Vertices, sondern - wenn du die Meshes anständig von vorne nach hinten renderst - spart Overdraw und hilft dabei Shader-Rechenzeit und Fillrate zu sparen. Ansonsten gilt grundsätzlich je Submesh ein Material (ja, ich weiß, man kann mit Shadern was machen und auch mehrere Texturen, aber dadurch wird es nicht wirklich schneller).

Also: Die Lösung ist - und das ist auch bei DirectX und OpenGL so - die (Sub-) Meshes nacheinander zu rendern.
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 19:33    Titel:

Erst mal danke für die schnelle Antwort Very Happy .
Das mit dem richtig nacheinander rendern, habe ich mir auch schon gedacht, aber was ist wenn ein komplexes Mesh wenig unterteilt ist und egal ist, ob man jetzt dieses Teilmesh zuerst rendert oder dieses, also ich meine, dass sich beide überschneiden, dann wird das Mesh aber nicht richtig gerendert. Auser man hat den Z-Buffer angeschalten, aber nehmen wir an, dass wir es mit durchsichtigen Materialien zu tun haben, dann gibt es ein Problem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 19:43    Titel:

Bei durchsichtigen Materialien sortierst du die Objekte ganz einfach von hinten nach vorne.

Also, grundsätzlich ist der Z-Buffer immer an, und du gehst wie folgt vor:


  • Objekte, die sichtbar sind (innerhalb des View-Frustum) in eine Liste packen
  • Liste sortieren nach Transparent / Deckend
  • Transparent: Sortieren von hinten nach vorne
  • Deckend: Sortieren von vorne nach hinten
  • Objekte mit deckenden Materialien rendern
  • Objekte mit transparenten Materialien rendern


Innerhalb der Listen Transparent und Deckend sortierst du nochmal nach Materialien, Texturen (und allem anderen, was RenderState-Changes verursacht) um diese möglichst wenig wechseln zu müssen. Und wenn du dann noch geschickt die Listen wiederverwendest (also weniger sortieren musst) und geschickt Queues aufbaust, dann schaffst du damit schon ziemlich viele Objekte/Vertices.

Grundsätzlich gilt:


  • so wenig wie möglich rendern (wenige Draw-Calls, große Batches)
  • so wenig State-Changes wie möglich
  • so wenig wie möglich Overdraw (Back-Face-Culling, Z-Buffer)


So geht das ganz grob Smile
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 19:54    Titel:

Mhm, das hört sich ganz gut an Surprised .
Werd ich ausprobieren, danke schön!
Behindert der Z-Buffer tatsächlich nicht so sehr die Performance? In großen Spielen, also die von Profis, ist der Z-Buffer standartmaßig aus. Man muss ihn fast immer Manuel anschalten, auch wenn die Grafikkarte dem Spiel um mehrfaches überlegen ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


simsmaster
Member


Anmeldedatum: 05.08.2009
Beiträge: 594
Wohnort: Langenhagen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 20:01    Titel:

Der Z-Buffer aus? Sicher, das du nicht AA oder VSync meinst? Eine Z-Buffer Einstellung habe ich noch nie gesehen Wink
_________________
mfg Simsmaster

Mein Projekt: The Kingdom of Darkness
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 20:01    Titel:

Das wage ich grundsätzlich zu bezweifeln, allerdings gibt es sicherlich Situationen, wo der Z-Buffer keinen Sinn macht. Hast du mal ein oder zwei Beispiele?

Grundsätzlich macht der Z-Buffer folgendes (vielleicht meinen wir nämlich etwas unterschiedliches):

Für jeden Pixel, der auf den Bildschirm gerendert wird, wird die Entfernung zur Kamera in den Z-Buffer geschrieben, aber nur, wenn im Z-Buffer nicht schon ein "näherer" Pixel ist. Muss der Pixel nicht gerendert werden, weil schon ein näherer vorhanden ist, so muß der Pixel nicht mehr geshadet werden (die Pixel-Shader werden also nicht ausgeführt) und es spart auch noch Füllrate, da der Pixel nicht in den Backbuffer geschrieben werden muss.

Der Z-Buffer bringt natürlich nur etwas bei Szenen, in denen auch Overdraw vorhanden ist, also sich mehrere Objekte überlagen (stell dir z.B. eine Landschaft mit Bergen vor, wenn du direkt vor einem Berg stehst, hast du viel Overdraw). Wenn du ein einzelnes Objekt renderst, dann ist es ohne Z-Buffer unter Umständen minimal schneller.

Tatsächlich wird es beim ein oder anderen Spiel sogar so sein, daß der Z-Buffer zwischendurch abgeschaltet oder wieder angeschaltet wird, was technische Gründe hat. Beim Deferred-Rendering wird der Z-Buffer z.B. vollkommen anders verwendet. Bei einigen Schattentechniken ebenfalls. Das muss man sich dann im Detail anschauen.

Edit: @simsmaster: Mit Z-Buffer ist der Depthbuffer gemeint. Den kann man schon ab- und anschalten.
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 20:18    Titel:

Wie wäre es mit Tomb Raider Underworld oder Age Of Empire III und noch andere aber bei diesen bin ich mir sicher.
Sehr interesant, so detailiert kannte ich den Z-Buffer gar nicht.
Aber vielen Dank, du hast mir mein Plugin ein großes Stück näher gebracht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 20:38    Titel:

Gerne, kein Thema...

Eine Frage noch: Wie ermittelst du, daß der Z-Buffer bei diesen Spielen deaktiviert ist?
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 21:50    Titel:

In den Grafikeinstellungen, heißt meistens Z-Buffer oder Tiefenspeicher aktivieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 28.07.2010, 21:54    Titel:

Im Spiel? Shocked

EDIT: Also hier steht nichts von der Einstellung. Hast du das vielleicht mit Bit-Depth verwechselt?

EDIT2: Ok, AOE3 ist von Anfang 2005 und in der Liste der GraKa's stehen uralte Dinger drin. Früher war es unter Umständen tatsächlich schneller, wenn der Z-Buffer deaktiviert wurde wegen der deutlich geringeren Speicherbandbreite. Bei 32 Bit müssen bei einer Auflösung von 1280x1024 und 60 FPS zusätzlich 80MB pro Sekunde geschaufelt werden. Bei 16 Bit immerhin noch 40MB. "Anfang des Jahrtausends" konnte dies durchaus je nach Grafikkarte ein Problem sein. Heutzutage aber eher nicht...
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


CsharpCoder
Member


Anmeldedatum: 26.05.2010
Beiträge: 30

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 12:05    Titel:

Hab in beiden Spielen nachgesehen, muss mich wohl verlesen haben oder hab ich bei einem älteren Spiel aufgeschnabt Embarassed . Jedenfalls ist der Z-Buffer sehr wahrscheinlich an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Monsaic
Member


Anmeldedatum: 20.08.2008
Beiträge: 193
Wohnort: Gelsenkirchen

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 16:13    Titel:

CsharpCoder hat Folgendes geschrieben:
In den Grafikeinstellungen, heißt meistens Z-Buffer oder Tiefenspeicher aktivieren.

Meinst sicherlich Schärfentiefe, Tiefenschärfe wie auch immer DOF auf deutsch heißt ;D
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer


Glatzemann
Member


Anmeldedatum: 24.07.2009
Beiträge: 3260
Wohnort: Leverkusen

Antworten mit Zitat
BeitragVerfasst am: 29.07.2010, 16:49    Titel:

Tiefenunschärfe?
_________________
Twitter · YouTube · MotoX Racers

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de