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?
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 (...)
.
m_width
x m_height
:
m_width
oder m_height
später ändern, können Sie den Speicher auf die gleiche Weise neu zuweisen: 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.
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:
Wenn das Ziel GL_TEXTURE_CUBE_MAP
ist, entspricht glTexStorage2D :
Wenn das Ziel GL_TEXTURE_1D
oder GL_TEXTURE_1D_ARRAY
ist, entspricht glTexStorage2D :
Da tatsächlich keine Texturdaten bereitgestellt werden, sind die im Pseudocode für
format
undtype
verwendeten Werte irrelevant und können als alle zulässigen Werte angesehen werden für den ausgewählteninternalformat
-Auszähler. [...] Bei Erfolg wird der Wert vonGL_TEXTURE_IMMUTABLE_FORMAT
GL_TRUE
. Der Wert vonGL_TEXTURE_IMMUTABLE_FORMAT
kann durch Aufrufen von glGetTexParameter mitpname
aufGL_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 einGL_INVALID_OPERATION
-Fehler generiert. auch wenn es nicht in der Tat die Dimensionen oder das Format des Objekts ändern würde.