CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst 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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst am: 28.07.2010, 19:01 Titel: |
|
Genauso wie alle anderen auch
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 |
|

|
CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst am: 28.07.2010, 19:33 Titel: |
|
Erst mal danke für die schnelle Antwort .
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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst 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  _________________ Twitter · YouTube · MotoX Racers
|
|
| Nach oben |
|

|
CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst am: 28.07.2010, 19:54 Titel: |
|
Mhm, das hört sich ganz gut an .
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 |
|

|
simsmaster Member
Anmeldedatum: 05.08.2009 Beiträge: 594 Wohnort: Langenhagen
|
Verfasst 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  _________________ mfg Simsmaster
Mein Projekt: The Kingdom of Darkness |
|
| Nach oben |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst 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 |
|

|
CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst 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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst 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 |
|

|
CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst am: 28.07.2010, 21:50 Titel: |
|
| In den Grafikeinstellungen, heißt meistens Z-Buffer oder Tiefenspeicher aktivieren. |
|
| Nach oben |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
Verfasst am: 28.07.2010, 21:54 Titel: |
|
Im Spiel?
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 |
|

|
CsharpCoder Member
Anmeldedatum: 26.05.2010 Beiträge: 30
|
Verfasst 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 . Jedenfalls ist der Z-Buffer sehr wahrscheinlich an. |
|
| Nach oben |
|

|
Monsaic Member
Anmeldedatum: 20.08.2008 Beiträge: 193 Wohnort: Gelsenkirchen
|
Verfasst 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 |
|

|
Glatzemann Member
Anmeldedatum: 24.07.2009 Beiträge: 3260 Wohnort: Leverkusen
|
|
| Nach oben |
|

|
|