Screenspace Error

Aus DGL Wiki
Version vom 6. Oktober 2004, 16:07 Uhr von Lyr (Diskussion | Beiträge) (Was ist der Screenspace Error?)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Was ist der Screenspace Error?

Der Screenspace Error beschreibt (normalerweise in Bezug zu Level of Detail-Algorithmen) für einen Punkt die Abweichung von Zeichenposition zur eigentlichen Position in Pixel. Der Worldspace Error (also einfach die Entfernung zweier Punkte im Worldspace) bezieht im Gegensatz zum Screenspace Error die Betrachterposition nicht mit in die Berechnung ein, wodurch der Worldspace Error für die Wahl einer Level of Detail-Stufe nicht ausreichend ist. Zudem bietet der Screenspace Error einen - für den Menschen - gut vorstellbaren Wert. Bei entsprechend leistungsfähigen Virtual Reality Systemen wird auch des öfteren ein maximaler Screenspace Error von < 1 Pixel verwendet, wodurch das gezeichnete Bild immer dem gewollten Bild (wie es ohne Level of Detail aussehen würde) entspricht und zudem Popping verhindert werden kann.

Vorbetrachtungen

Vor allem für Landschaften wird für die Wahl des Level of Detail häufig der Screenspace Error verwendet, da eine Annäherung sehr einfach und schnell möglich ist.

Da das berechnen des Screenspace Errors für allgemeine Objekte zu aufwändig wäre, werden hier üblicherweise Schätzungen anhand der Entfernung oder vorberechnete Werte verwendet.

Die hier verwendeten Annahmen sind:

  • Errorwert ausschließlich in der Höhe der Landschaft.
  • Gleicher Abstand => gleicher Errorwert, was zwar nicht dem Modell von OpenGL entspricht aber dennoch sinnvoll ist, da es zum einen einfacher und zum anderen durch die Möglichkeit der schnellen Rotation meistens auch brauchbarer ist.

Berechnung des Faktors

Der Faktor mit dem der Worldspace Error (Hier der Höhenunterschied zwischen dem niedrigeren und dem höheren Level of Detail in Weltcoordinaten) multipliziert werden muss um den Screenspace Error zu erhalten ist üblicherweise Konstant während der Ausführung. Jedoch erfolgt die Wahl des maximalen Screenspace Errors bereits hier.

Da wir nur die Höhenunterschiede beachten, verwenden wir auch nur die Vertikale Auflösung. Die Formel für den Faktor teilen wir der einfachheit halber in 2 Teile:

T = EMax / Vres
EMax ... der gewünschte maximale Error wert in Pixel.
Vres ... vertikale Auflösung.

Zusätzlich zu dieser Formel wird noch das Verhältnis der Entfernung in Weltkoordinaten zur Entfernung auf dem Bildschirm benötigt. Dies ergibt sich durch den Öffnungswinkel der Sichtpyramide welcher vertikal durch Near, Top und Bottom der Frustum (welche mit glFrustum oder gluPerspective angegeben wurde) definiert:

F = Near / ( |Top| + |Bottom| )

Da üblicherweise Top = -Bottom kann man auch schreiben

F = Near / ( 2 * |Top| )

Diese 2 Teile werden nun noch kombiniert:

C = F / T

wobei C nun der konstante Faktor ist mit dem die Level of Detail Überprüfungen durchgeführt werden.

Prüfen des Screenspace Errors

Da der Maximale Error bereits in C eingeflossen ist, kann hier nur noch eine Überprüfung statt finden ob der Error größer oder kleiner ist als der gewünschte maximale Screenspace Error. Hierfür wird zuerst der Errorwert benötigt:

E = Werr * C
Werr ... Errorwert in Weltkoordinaten (hier der Höhenunterschied zwischen 2 LOD-Stufen).
C ... der oben berechnete Faktor.

Der Errorwert E muss sowohl für den Unterschied zwischen aktueller LOD- und nächst höherer LOD-Stufe (E1), also auch für den Unterschied zwischen nächst geringerer LOD- und aktueller LOD-Stufe (E2) berechnet werden.

Nun wird noch die Distanz benötigt:

Dist² = (Cx - Ex)² + (Cy - Ey)² + (Cz - Ez)²
Cxyz ... Die Position der Kamera.
Exyz ... Der Punkt für den der Errorwert berechnet wird.

Das mit einbeziehen der Z-Koordinate bei der Distanzberechnung ist natürlich optional.

Nun kann der Vergleich erfolgen:

  • E1 > Dist => erhöhe LOD Stufe um 1
  • E2 < Dist => senke LOD Stufe um 1

Um nicht die Wurzel von Dist berechnen zu müssen werden hier üblicherweise E1 und E2 quadriert.