Manuelle Tiefensortierung
-
Hey,
hätte mal wieder eine Frage wegen meinem Q3 Kartenloader, bzw generell im Bezug auf 3D Geschichten.
Und zwar muss ich ja auf diese Art sinnvollerweise rendern:
1. Zuerst undurchsichte Flächen mit Front-to-Back Reihenfolge rendern.
2. Danach durchsichtige Fläche mit Back-to-Front Reigenfolge rendern.Vorrausgesetzt ich habe schon alle sichtbaren Flächen bestimmt und diese in zwei Listen unterteilt: opaque und transparent.
Mich würde jetzt interessieren, wie bestimme ich am besten die Entfernung von einer Fläche zur Kamera?
Und noch viel wichtiger: wie sortiere ich die Flächen (je nach Entfernung) am schnellsten?
Vielen Dank,
Tim
-
a²+b²=c² (für Photonen in der Nähe von schwarzen Löchern keine Gewähr)
-
Vertexwahn schrieb:
a²+b²=c² (für Photonen in der Nähe von schwarzen Löchern keine Gewähr)
a har har har har, achwaaas : )
Ich meine, welchen Punkt der Fläche nehme ich am besten für die Rechnung? Die Mitte? Den ersten Vertex? Egal?
Und dann wäre wie schon gesagt noch die Frage mit der Sortierung.
-
Das Problem, das ich sehe ist doch wie splitet man Dreiecke die sich schneiden – da sollte aber viel Literatur zu finden sein, da bevor sich ein schlauer Mensch Z-Buffering ausgedacht hat Manuelle Tiefensortierung leider nötig war.
BTW: wenn du die Position eines Vertex in Bezug auf das Kamerakoordiantensystem wissen willst muss du das Vertex einfach nur mit der ModelviewMatrix multiplizieren
- das gleiche was deine 3D Pipeline macht und und einfach den Abstand zum Ursprung Berechnen
-
Vertexwahn schrieb:
wenn du die Position eines Vertex in Bezug auf das Kamerakoordiantensystem wissen willst muss du das Vertex einfach nur mit der ModelviewMatrix multiplizieren
- das gleiche was deine 3D Pipeline macht und und einfach den Abstand zum Ursprung BerechnenWie muss ich das jetzt verstehen? Die Position des Vertex in Bezug auf den Nullpunkt (=Kamerakoordinatensystem) ? Okay, wunderbar, danke.
-
-
wie splitet man Dreiecke die sich schneiden
in der praxis gar nicht: man nimmt einfach in kauf, diesen fall nicht performant loesen zu koennen.
zur groben sortierung von polygonen eignen sich ordering tables.
-
Die Sortierung von Polygonen nach ihrer Entfernung zur Kamera ist nicht immer eindeutig. Kann man auch gar nichts daran ändern. Die Darstellung von sich durchdringenden Objekten wird auch immer falsch sein. Und nicht zuletzt möchtest du nicht wirklich das schöne Zeichnen eines Vertexbuffers, was normal in einem Rutsch geht, 10mal unterbrechen, um die Dreiecke von 2 buffern in durcheinandergewürfelter Reihenfolge zu zeichnen. Das ist stinklangsam und die Grafikkarte muss dann ständig auf die CPU warten.
Nimm einfach nen z-Buffer.

-
Bei transparenten Objekten macht man die Sortierung btw. in der Regel nicht Polygon-weise sondern Objekt-weise. Wenn die Objekte an allen Stellen entweder voll oder gar nicht transparent sind, kannst du auch den Alphatest vom z-Buffer benutzen.
-
Letztlich ist es auch wurscht, ob die Sortierung nun perfekt ist oder nicht. Die Leveldesigner sollen einfach drauf achten keine fiesen Engine-Fallen zu bauen. Wann braucht man schon transparente sich durchdringende Dreiecke?
-
Hi!
Quake3 definiert für jedes Material einen Sortierwert. Dieser errechnet sich über ein Konstante (die im Materialscript angegeben wird, standard ist opaque) und ob eine Lightmap für das Face verwendet wird.
m_pFaceList[ i ].m_uSortValue = ( ( l_pShader->m_nSortValue ) << 16 ) + ( l_pSurface->m_uShader << 8 ) + ( l_pSurface->m_uLightmap + 1 );Wenn kein "Shader" (Materialscript) definiert wurde ist der Sortierwert einfach Null.
Wenn jedes Face einen solchen Wert bekommen hat kannst du die Faces einfach per Quicksort oder einem anderen Sortieralgorithmus sortieren. Danach haben die Faces die korrekte Renderreihenfolge und du kannst einfach deine Faceliste durchrendern.Die Sortierkonstanten nochmals:
typedef enum { SS_BAD, SS_PORTAL, // mirrors, portals, viewscreens SS_ENVIRONMENT, // sky box SS_OPAQUE, // opaque SS_DECAL, // scorch marks, etc. SS_SEE_THROUGH, // ladders, grates, grills that may have small blended edges // in addition to alpha test SS_BANNER, SS_FOG, SS_UNDERWATER, // for items that should be drawn in front of the water plane SS_BLEND0, // regular transparency and filters SS_BLEND1, // generally only used for additive type effects SS_BLEND2, SS_BLEND3, SS_BLEND6, SS_STENCIL_SHADOW, SS_ALMOST_NEAREST, // gun smoke puffs SS_NEAREST // blood blobs } shaderSort_t;grüße
-
Ich bin so doof : )
Wie schon in ICQ gesagt, ich hab an die sort Werte gar nicht mehr gedacht, ich hab sie benutzt, um beim Laden die Faces einmal zu sortieren, aber nicht bei jedem Frame... d'oh.Was ich noch nicht so ganz verstehe: Warum hat es Einfluss, ob für das Face eine Lightmap benutzt wird?
Aber schonmal vielen Dank, das ist hilfreich.
-
Transparente Surfaces sind imho nicht gelightmapped.
grüße