Wie kann ich die Größe von bestehenden Texturanhängen an meinem Framebuffer ändern?

8

Wenn ich die Größe meines Fensters ändere, muss ich die Größe meiner Texturen ändern, die an meinen Framebuffer angehängt sind. Ich habe versucht, glTexStorage2D erneut aufzurufen, mit unterschiedlichen Größenparametern. Das funktioniert jedoch nicht.

Wie kann ich die Texturen meines Framebuffers anpassen? (Einschließlich der Tiefenanhang)

BEARBEITEN

Code Ich habe es versucht:

%Vor%

wobei m_name, m_target und m_format aus der ursprünglichen Textur gespeichert werden und m_width und m_height die neuen Dimensionen sind.

EDIT2

Bitte sagen Sie mir, warum das abgelehnt wurde, damit ich die Frage beheben kann.

EDIT3

Hier hatte jemand anderes das gleiche Problem.

  

Ich habe festgestellt, dass die Textur korrekt zum FBO gerendert wurde, aber dass sie in der falschen Größe angezeigt wurde. Es war so, als ob die Textur zum ersten Mal an den Standard-Framebuffer gesendet wurde, die Texturgröße wurde dauerhaft eingestellt und dann, wenn eine skalierte Textur gesendet wurde, wurde sie so behandelt, als wäre sie die Originalgröße. Wenn beispielsweise die erste Textur 100x100 und die zweite Textur 50x50 ist, wird die gesamte Textur im linken unteren Bildschirmbereich angezeigt. Wenn dagegen die ursprüngliche Textur 50x50 und die neue Textur 100x100 wäre, wäre das Ergebnis das untere linke Viertel der Textur, die über den gesamten Bildschirm angezeigt wird.

Allerdings verwendet er einen Shader, um das zu beheben. So möchte ich das nicht machen. Es muss eine andere Lösung geben, oder?

    
gartenriese 29.04.2014, 10:49
quelle

1 Antwort

14

Wenn Sie glTexImage2D (...) verwenden, um Speicher für Ihre Textur zuzuordnen, wäre es möglich, den Speicher für jedes Bild in der Textur jederzeit neu zuzuweisen, ohne vorher die Textur zu löschen.

Sie sind jedoch nicht mit glTexImage2D (...) , Sie verwenden glTexStorage2D (...) . Dadurch wird ein unveränderliches -Texturobjekt erstellt, dessen Speicheranforderungen einmal festgelegt und nie wieder geändert werden können. Alle Aufrufe von glTexImage2D (...) oder glTexStorage2D (...) nach der anfänglichen Zuweisung von Speicher generieren GL_INVALID_OPERATION und führen nichts weiter aus.

Wenn Sie eine Textur erstellen möchten, deren Größe jederzeit geändert werden kann, verwenden Sie nicht glTexStorage2D (...) . Übergeben Sie stattdessen Dummy-Werte (, aber kompatible ) für den Datentyp und das Format an glTexImage2D (...) .

Wenn Sie beispielsweise eine Textur mit 1 LOD zuweisen möchten, die m_width x m_height :

ist %Vor%

Wenn sich m_width oder m_height später ändern, können Sie den Speicher auf die gleiche Weise neu zuweisen:

%Vor%

Dies ist eine ganz andere Situation als wenn Sie glTexStorage2D (...) verwenden. Das verhindert, dass Sie den Speicher neu zuweisen und erstellt einfach einen GL_INVALID_OPERATION -Fehler.

Sie sollten die Manpage für glTexStorage2D (...) lesen, es heißt Folgendes :

  

Beschreibung

     
    

glTexStorage2D gibt die Speicheranforderungen für alle Ebenen an einer zweidimensionalen Textur oder einer eindimensionalen Texturanordnung gleichzeitig. Sobald eine Textur mit diesem Befehl angegeben wird, werden das Format und die Dimensionen aller Ebenen unveränderlich, es sei denn, es handelt sich um eine Proxy-Textur. Der Inhalt des Bilds kann möglicherweise noch geändert werden, < strong> die Speicheranforderungen dürfen sich jedoch nicht ändern . Eine solche Textur wird als unveränderliche Formattextur bezeichnet.

         

Das Verhalten von glTexStorage2D hängt vom Zielparameter ab.

  

Wenn das Ziel GL_TEXTURE_2D, GL_PROXY_TEXTURE_2D , GL_TEXTURE_RECTANGLE , GL_PROXY_TEXTURE_RECTANGLE oder GL_PROXY_TEXTURE_CUBE_MAP ist, ist der Aufruf von glTexStorage2D äquivalent, wenn keine Fehler generiert werden, um den folgenden Pseudocode auszuführen:

%Vor%

Wenn das Ziel GL_TEXTURE_CUBE_MAP ist, entspricht glTexStorage2D :

%Vor%

Wenn das Ziel GL_TEXTURE_1D oder GL_TEXTURE_1D_ARRAY ist, entspricht glTexStorage2D :

%Vor%
  
    

Da tatsächlich keine Texturdaten bereitgestellt werden, sind die im Pseudocode für format und type verwendeten Werte irrelevant und können als alle zulässigen Werte angesehen werden für den ausgewählten internalformat -Auszähler. [...] Bei Erfolg wird der Wert von GL_TEXTURE_IMMUTABLE_FORMAT GL_TRUE . Der Wert von GL_TEXTURE_IMMUTABLE_FORMAT kann durch Aufrufen von glGetTexParameter mit pname auf GL_TEXTURE_IMMUTABLE_FORMAT ermittelt werden. Es dürfen keine weiteren Änderungen an den Abmessungen oder dem Format des Texturobjekts vorgenommen werden. Wenn Sie einen Befehl verwenden, der die Abmessungen oder das Format des Texture-Objekts ändern kann (z. B. glTexImage2D oder ein anderer Aufruf von glTexStorage2D ), wird ein GL_INVALID_OPERATION -Fehler generiert. auch wenn es nicht in der Tat die Dimensionen oder das Format des Objekts ändern würde.

  
    
Andon M. Coleman 29.04.2014, 18:59
quelle

Tags und Links