Computergrafik

Verdeckung

Motivation: Warum Verdeckung?

  • Zentraler Tiefenhinweis für die menschliche Wahrnehmung
  • Objekte im Vordergrund verdecken Hintergründe
  • Verletzung dieses Prinzips führt zu unrealistischen 3D-Szenen
  • Render-Reihenfolge allein genügt nicht

Motivation

Bild: Vierge Marie

Maler-Algorithmus (Painter's Algorithm)

Grundidee: Zeichnen von hinten nach vorne.

  1. Sortiere Objekte nach Kameraentfernung.
  2. Zeichne entferntestes Objekt zuerst.
  3. Zeichne nähere Objekte darüber.

Bild: Zapyon

Grenzen: Maler-Algorithmus 

Problem: 

  1. A liegt teilweise vor B.
  2. B liegt teilweise vor C.
  3. C liegt teilweise vor A.

Bild: Zapyon

  • Maler-Algorithmus setzt voraus, dass man Polygone nach ihrer Tiefe sortieren kann
  • Bei zyklischer Überdeckung funktioniert das nicht:
    • Zeichnest du A zuerst, verdeckt C später einen Teil von A korrekt, aber B wird falsch dargestellt
    • Zeichnest du B zuerst, entsteht ein anderer Fehler.
  • Egal welche Reihenfolge gewählt wird, mindestens ein Bereich wird falsch übermalt

Z-Buffer-Algorithmus (Prinzip)

  • Tiefenspeicherung pro Pixel statt Sortierung
  • Zusätzlicher Depth Buffer speichert z-Werte (=Tiefenwerte)
  • Sichtbar bleibt immer das Fragment mit der geringsten Tiefe

Bild: Zeus

Z-Buffer-Algorithmus (Pseudocode)

  • Initialisiere den z-Buffer auf Maximalwert für jedes Pixel
  • Für alle Objekte (Polygone*)
    • Für alle Pixel eines Objekts
      • Berechne Abstand vom Augenpunkt zum Pixel (Objekt)
      • Vergleiche berechneten Abstand mit Wert im z-Buffer
        • Falls ( Abstand < gespeicherter Wert):
          • trage die neuen Farbwerte in Farbspeicher und den neuen z-Wert in den z-Buffer für dieses Pixel
            Objekt ist näher
        • Andernfalls:
          • ändere nichts Objekt ist verdeckt

* Der Z-Buffer-Algorithmus kann auch andere Objekte verarbeiten

Z-Buffer-Algorithmus (Beispiel)

Bild: Gemeinfrei

Maler- vs. Z-Buffer-Algorithmus 

Bild: A. Nischwitz

Maler

Maler

z-Buffer

Z-Buffer-Algorithmus (Grenzen)

Z-Fighting: Begrenzte Auflösung führt zu Flimmern bei nah beieinander liegenden Flächen

→ Lösung: Subpixel-Antialiasing

 

Transparente Objekte: Reiner Tiefentest versagt, da Beiträge mehrerer Ebenen kombiniert werden müssen

→ hier brauchen wir noch andere Algorithmen

Weitere Verfahren

Backface Culling

Verwirft Flächen, die von der Kamera weg zeigen.

BSP-Bäume

Rekursive Raumzerlegung für statische Szenen.

Scanline

Zeilenweise Berechnung der Sichtbarkeit.

Dieses werden wir hier nicht weiter betrachten.

Scanline

Zeilenweise Berechnung der Sichtbarkeit.

Raytracing

Bild: Phrood

Raytracing (Grundprinzip)

Anstatt Polygone auf den Bildschirm zu projizieren (Rasterisierung), verfolgt Raytracing den Weg des Lichts umgekehrt:

  • Aussendung: Strahlen werden von der Kamera durch jedes Pixel gesendet
  • Schnittprüfung: Der Strahl wird mit allen Objekten in der Szene geschnitten
  • Sichtbarkeit: Der am nächsten liegende Schnittpunkt bestimmt sichtbares Objekt

Bild: Phrood

Raytracing-Algorithmus (Pseudocode)

Für jedes Pixel (x, y) der Bildebene:
  Generiere einen Primärstrahl vom Augpunkt durch (x, y)
  
  Setze t_min = Unendlich
  Setze Treffer_Objekt = Null
  
  Für jedes Objekt in der Szene:
    Berechne Schnittpunkt t mit dem Strahl
    
    Wenn (t > 0) UND (t < t_min):
      t_min = t
      Treffer_Objekt = Aktuelles_Objekt
      
  Wenn Treffer_Objekt != Null:
    Farbe(x, y) = BerechneBeleuchtung(Treffer_Objekt, t_min)
  Sonst:
    Farbe(x, y) = Hintergrundfarbe

z-Buffer vs. Raytracing

Eigenschaft Z-Buffer Raytracing
Komplexität O(P) - skaliert mit Pixeln O(P * log n) - skaliert mit Strahlen & Objekten
Verdeckung Pixelweise via Tiefentest Implizit via Schnittprüfung
Schatten Zusatzverfahren
​(Shadow Maps)
Natürlich via Schattenstrahlen
Hardware Optimiert für GPUs
(Standard)
Rechenintensiv
(Echtzeit erst kürzlich)

P - Anzahl Pixel (Bildschirm)

n - Anzahl Objekte 

✅ Zusammenfassung

  • Herausforderungen:
    • Überlappende & sich schneidende Objekte
    • Dynamische Szenen (Kamerabewegung)
  • Maler-Algorithmus scheitert bei zyklischer
    (gegenseitiger Überdeckung)
  • z-Buffer-Algorithmus sehr effektiv → Tiefentest
  • Ray-Tracing ist teuer, aber sehr genau → Schnittprüfung

Nicht die Zeichenreihenfolge entscheidet über die Sichtbarkeit, sondern die geringste Tiefe pro Pixel.

CG7 Verdeckung

By blackbill

CG7 Verdeckung

  • 15