Wie kopiert man Textur1 effizient in texture2?

8

Ich möchte texture1 nach texture2 kopieren. Der dümmste Weg ist das Kopieren von tex1-Daten von der GPU zur CPU und dann das Kopieren der CPU-Daten in die GPU. Der dumme Code ist wie folgt:

%Vor%

Wie ich weiß, muss es eine Methode geben, die das Kopieren von Daten von GPU tex zu GPU tex ohne CPU unterstützt. Ich überlege, FBO zu verwenden, das ein Tex1-Quad zu Tex2 rendert. Aber irgendwie denke ich, dass es immer noch naiv ist. Was ist der effizienteste Weg, dies zu implementieren?

    
rtrobin 19.04.2013, 08:21
quelle

1 Antwort

11

Wenn Sie Unterstützung für OpenGL 4.3 haben, gibt es das unkomplizierte glCopyImageSubData für genau diesen Zweck:

%Vor%

Natürlich muss dazu die Zieltextur bereits mit einem Bild in geeigneter Größe und Format versehen sein (mit einem einfachen glTexImage2D(..., nullptr) oder vielleicht noch besser glTexStorage2D , wenn Sie GL 4 sowieso haben).

Wenn Sie das nicht haben, dann könnte das Rendern einer Textur in die andere mit einem FBO immer noch der beste Ansatz sein. Am Ende müssen Sie nicht einmal die Quelltextur rendern. Sie können einfach beide Texturen an einen FBO anhängen und einen Farbanhang über den anderen blättern, indem Sie glBlitFramebuffer verwenden. (Kern seit OpenGL 3 oder mit der Erweiterung GL_EXT_framebuffer_blit in 2.x, praktisch überall dort, wo FBOs an erster Stelle stehen):

%Vor%

Natürlich, wenn du das mehrmals machst, ist es vielleicht eine gute Idee, diesen FBO am Leben zu halten. Dies erfordert auch, dass das Zieltexturbild zuvor die geeignete Größe und das richtige Format aufweist. Oder Sie könnten auch den Vorschlag von Michael verwenden, nur die Ausgangstextur an den FBO anzuhängen und eine gute alte glCopyTex(Sub)Image2D in die Zieltextur einzufügen. Muss ausgewertet werden, was eine bessere Leistung bringt (falls vorhanden).

Und wenn Sie das nicht einmal haben, dann könnten Sie immer noch Ihren Ansatz verwenden, eine Textur zu lesen und diese Daten in die andere zu schreiben. Aber anstatt den CPU-Speicher als temporären Puffer zu verwenden, verwenden Sie ein Pixel-Puffer-Objekt (PBO) (Kern seit OpenGL 2.1). Sie werden immer noch eine zusätzliche Kopie haben, aber das wird zumindest eine GPU-GPU-Kopie sein (oder ist es wahrscheinlich).

    
Christian Rau 19.04.2013, 08:55
quelle

Tags und Links