2016-07-19 5 views
0

Wie kann ich den gleichen "Texturspeicher" an Texturen mit unterschiedlichen Dimensionen binden?Binden Sie den gleichen "Texturspeicher" an Texturen mit unterschiedlichen Dimensionen

Zum Beispiel muss ich ein Array von 2D-Bildern mit einem sampler2DArray in einem Shader und einem sampler3D in einem anderen Shader zugreifen, ohne die Daten auf dem Grafikkartenspeicher zweimal laden und speichern zu müssen.

Ich möchte so etwas wie dies zu tun:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D_ARRAY, tex); 
glTexImage3D(GL_TEXTURE_2D_ARRAY, ...); // allocate & store pixel data 

und dann:

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_3D, tex); // "reuse" the texture storage with a 
             // different dimensionality in another 
             // texture unit 

Aber die letzte Zeile ist offensichtlich ungültig.

Gibt es irgendeine Methode, so etwas zu tun?

Antwort

0

OpenGL (4.3+) hat ein Konzept namens view textures. Wenn Sie eine Textur mit immutable storage erstellen, können Sie eine Textur erstellen, die auf diesen unveränderlichen Speicher verweist. Oder Teil dieses unveränderlichen Speichers. Sie können Dinge wie Bildformate (wenn sie kompatibel sind) und sogar Texturziele ändern. Sie können ein einzelnes Element eines 2D-Arrays extrahieren und es als reguläre 2D-Textur verwenden. Oder Sie können eine 2D-Textur in ein 2D-Array mit 1 Layer umwandeln.

Sie können den Speicher einer 2D-Array-Textur jedoch nicht als 3D-Textur anzeigen. Oder umgekehrt. Ihre Mipmaps funktionieren nicht auf die gleiche Weise. In einer 3D-Textur, Mipmaps verringern in X, Y und Z. In 2D-Array Texturen, bekommen sie nur kleiner in X und Y.

Auch Vulkan Sie nicht lassen eine VkImageView erstellen, die eine 3D-Bildansicht ist von einer VkImage, die als ein Array-2D-Bild zugeordnet wurde (oder umgekehrt).

Verwandte Themen