2017-11-22 5 views
0

Ich bin etwas verwirrt über die Beziehung zwischen Framebuffer und Viewport. Ich habe eine Anwendung, die einen Haupt-FBO der Größe screenWidth + 1 und screenHeight verwendet. Ich habe einen zur Breite hinzugefügt, weil es der einzige Weg ist, den ich gefunden habe, der wirklich Vollbild in X11 aktiviert (zumindest auf dem Board, das wir verwenden).Framebuffer-Größe und Ansichtsfenster-Beziehung

In jedem Fall erstelle ich die Projektion und Kamera Matrizen basierend auf screenHidth & screenHeight (Ignorieren der +1). Es gibt keinen anderen Verweis auf dieses +1 in der Anwendung, außer wenn wir das Fenster und den Haupt-FBO erstellen. Alles in allem habe ich erwartet, dass es gut funktioniert und nur eine leere Pixelspalte am Ende meines FBO hat.

Das Ansichtsfenster, das ich verwende, wird als glViewport (0, 0, screenWidth, screenHeight) festgelegt. Die y-Koordinate ist 0, weil meine Projektion auf der y-Achse gedreht ist. Es war schon eine ganze Weile so und (ich dachte) es gab keine Artefakte aufgrund dieser +1.

Aber ich habe einen schnellen Test gemacht und diese +1 auf +500 oder eine andere große Zahl geändert und ich bemerkte, dass einige Objekte in der Szene nach rechts verschoben wurden. Es scheint, dass die Auffüllung in der FBO Zeug betrifft.

Warum sollte das der Fall sein? Nach meinem Verständnis konvertiert das Ansichtsfenster normalisierte Gerätekoordinaten in Fensterkoordinaten. Also, wenn ich das richtig verstehe, indem ich screenWidth und screenHeight für das Viewport verwende, sollte ich nur einen screenWidth x screenHeight Bereich in der FBO füllen, mit Ausnahme dieses zusätzlichen Pixels am Ende.

Kann jemand etwas Licht darauf werfen? Müsste ich mein Ansichtsfenster ändern, um es an die Größe des FBO anzupassen?

+1

Da Sie die Daten, die Sie in einem FBO gerendert haben, nie sehen werden, müssen Sie _something_ tun, damit es tatsächlich auf dem Bildschirm erscheint. – derhass

Antwort

1

Ich weiß nichts über die Notwendigkeit eines zusätzlichen Pixels für Fullscreen-Rendering.

Sie sind jedoch in Ihrem Verständnis des Ansichtsfensters richtig. Es wird verwendet, um normalisierte Gerätekoordinaten (-1 bis +1) auf Pixelkoordinaten in den FBO-Anhängen abzubilden. (-1, -1) in der normalisierten Gerätekoordinate ist die linke untere Ecke des Ansichtsfensters (Parameter x und y von glViewport()). (+1, +1) ist die obere rechte Ecke des Ansichtsfensters. Daher ändert sich die Größe in Pixel der gerenderten Oberfläche in der FBO nicht, wenn Sie die Strukturanhänge vergrößern.

Nach dem Rendern müssen Sie einige Operationen ausführen, um die Pixel aus der gerenderten Textur in den Darstellungsbereich Ihres Fensters zu übertragen, um tatsächlich etwas anzuzeigen. Dies ist normalerweise die default framebuffer. Normalerweise werden Sie blit von Ihrem Rendering FBO (das möglicherweise Multisampling hat) auf den Standard-Framebuffer. Ich würde erwarten, dass das Problem im Blitting-Teil für Ihre Rendering-Pipeline liegt.

+0

Danke für die Klarstellung. Das Problem war, dass ich die gepolsterte Größe in meiner Anwendung einschließlich in der Projektions- und Kameramatrix verwendete, also war alles ein bisschen durcheinander. Ich habe dafür gesorgt, dass ich jetzt dieses zusätzliche Pixel ignoriere und die richtige Größe benutze und alles sieht gut aus. Ich werde dies als eine Antwort markieren, da es die Beziehung zwischen Ansichtsfenster und Farbanhang eines FBO verdeutlicht. – DolphinAndWailu