Screenspace Error
Screenspace Error
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.