10 Stimmen

Wie kopiere ich den Tiefenpuffer in eine Textur auf der GPU?

Ich möchte die aktuelle Tiefe Puffer zu einer Textur zu erhalten, um es in einem Shader zugreifen. Aus verschiedenen Gründen kann ich nicht tun, eine separate Tiefe Pass, aber müssten die bereits gerenderten Tiefe zu kopieren.

glReadPixels würde die CPU belasten und möglicherweise die Leistung beeinträchtigen, und soweit ich weiß glBlitFramebuffer kann nicht Tiefe-zu-Farbe überblenden, sondern nur Tiefe-zu-Tiefe.

Wie kann man dies auf der GPU tun?

7voto

Nicolas Lefebvre Punkte 4137

Die moderne Art, dies zu tun, wäre die Nutzung eines FBO. Fügen Sie eine Farb- und Tiefentextur hinzu, rendern Sie, deaktivieren Sie dann den FBO und verwenden Sie die Texturen als Eingaben für einen Shader, der auf den Standard-Framebuffer rendern wird.

Alle Informationen, die Sie über FBO benötigen, finden Sie hier aquí .

5voto

Nicol Bolas Punkte 409659

Das Kopieren des Tiefenpuffers in eine Textur ist ziemlich einfach. Wenn Sie eine neue Textur erstellt haben, die Sie nicht mit glTexImage* aufgerufen haben, können Sie glCopyTexImage2D verwenden. Damit werden Pixel aus dem Framebuffer in die Textur kopiert. Um Tiefenpixel zu kopieren, verwendet man ein GL_DEPTH_COMPONENT-Format. Ich würde GL_DEPTH_COMPONENT24 vorschlagen.

Wenn Sie zuvor eine Textur mit einem Tiefenkomponentenformat erstellt haben (d.h. zu einem beliebigen Zeitpunkt nach dem ersten Frame), dann können Sie mit glCopyTexSubImage2D direkt in diese Bilddaten kopieren.

Es sieht auch so aus, als ob Sie Probleme mit dem Zugriff auf Tiefenkomponententexturen in Ihrem Shader haben, da Sie Tiefe-zu-Farbe kopieren wollen (was nicht erlaubt ist). Wenn Sie sind, dann ist das ein Problem, das Sie behoben bekommen sollten.

In jedem Fall sollte das Kopieren das letzte Mittel sein. Wann immer möglich, sollten Sie Framebuffer-Objekte verwenden. Rendern Sie einfach direkt auf Ihre Textur.

5voto

Amir Zadeh Punkte 3321

Der beste Weg wäre die Verwendung von FBOs, für eine bessere Leistung und einige Fragen der Codierung Stil, was auch immer. Wenn Sie nicht interessiert sind, sehen Sie sich diesen Code an. Er stammt aus der Zeit, als ich noch viel jünger war (und nicht wusste, dass es FBOs gibt).

int shadowMapWidth = 512;
int shadowMapHeight = 512;
glGenTextures(1, &m_depthTexture);

glBindTexture(GL_TEXTURE_2D, m_depthTexture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 512,512);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X