2013-10-19 13 views
7

Ich habe versucht, einen OpenGL-Code zu starten, es hatte GL_DEPTH_BUFFER_BIT in GlClear() gelöscht, aufgrund dessen konnte ich meine Szene nicht wiedergeben. Ich habe dieses Bit hinzugefügt und die Szene wurde gerendert. Warum ist es notwendig, dieses klare Bit zu verwenden?Warum müssen wir den Tiefenpuffer in OpenGL während des Renderings löschen?

Ich kenne vielleicht den Grund dafür, die Tiefe Puffer-Werte von GPU zuvor gelöscht, aber ich möchte nur bestätigen.

Antwort

15

Der Tiefenpuffer enthält die "Tiefe" des Pixels in der Szene. Wenn OpenGL Ihre Geometrie rendert, wird jedes Fragment (Pixel) an diesem Punkt mit dem Wert des Tiefenpuffers verglichen. Wenn dieses Fragment einen niedrigeren z-Wert als der im Puffer hat, wird es der neue niedrigste Wert und damit das zu rendernde Pixel. Wenn nicht, render es nicht - es gibt etwas näheres, das es blockiert. Das ist die gist davon - Sie können in die Details selbst lesen.

Was passiert nun, wenn sich die Szene ändert? Sie möchten den Bildschirm löschen, so dass Sie alles neu zeichnen, aber Sie möchten auch den Tiefenpuffer löschen. Warum? Denn sonst werden alle neuen Pixel mit den Tiefenwerten aus dem vorherigen Bild verglichen. Das macht keinen Sinn - sie sollten mit denen in dem Rahmen verglichen werden, in dem sie sich befinden! Sie haben Recht mit Ihrer Argumentation.

+4

Sie könnten auch den Tiefenbereich und die Richtung der Tiefenprüfung jeden Frame wechseln. Aber es stellt sich heraus, dass das Löschen des Tiefenpuffers auch eine Leistungsoptimierung auf moderner Hardware ist - sie implementieren eine verlustfreie Z-Puffer- (und Farbpuffer-) Komprimierung durch Aufteilen des Framebuffers in Kacheln, wenn die GPU nur einige Bits pro Lesen/Schreiben benötigt -tile beim Abrufen von Werten für Bereiche des Bildschirms, in denen nichts enthalten ist. Der alte Hack, den die Leute benutzten, um den Farbpuffer und den Tiefenpuffer zu löschen, schadet eigentlich der Leistung moderner GPUs;) –

+0

Genau das, was ich dachte, ist der Grund :) Perfect ans. – 2am

Verwandte Themen