Wie kann ich eine 3D-Textur in iOS verwenden?

8

Ich kann die glTexImage3D() -Funktion nicht in OpenGL ES 2.0 von OpenGL finden. Wie kann ich also eine 3D-Textur verwenden, zB: eine .tga-Datei?

Weiß jemand, wie man eine 3D-Textur in OpenGL ES 2.0 verwendet?

    
Ning 11.02.2012, 15:56
quelle

2 Antworten

12

OpenGL ES 1.x und 2.x schreiben keine Unterstützung für 3D-Texturen vor - siehe z. die kanonische Manpage für glBindTexture , in der nur GL_TEXTURE_2D und GL_TEXTURE_CUBE_MAP als Ziele - und die iOS-Hardware bietet keine geeignete Erweiterung.

Die beste Lösung, die ich mir ausgedacht habe, ist das Packen einer 3D-Textur, als ob es eine 2D-Textur wäre, also haben Sie eine 128x128x128 3D-Textur und Sie legen es als 128 separate 128x128 Bilder in einem 16x8 Gitter auf einer einzelnen 2d Textur. Die 2d-Textur ist also 2048x1024 Pixel groß und nähert sich damit der Hardwaregrenze auf der iPhone 4 und iPad 2 Generation von Geräten und den ES 2.0 kompatiblen iOS Geräten, die ihnen vorausgingen.

Sie füttern dann eine 3D-Textur-Koordinate genau so in Ihren Fragment-Shader, als ob es eine Möglichkeit gäbe, 3D-Texturen nativ zu indizieren, aber machen Sie ein paar schnelle Mathe, um sie auf 2D zu reduzieren.

Also, im 128x128x128 Beispiel würden Sie etwas wie (hier codiert, wie ich rede, ungetestet) tun:

%Vor%

Das ist wahrscheinlich nicht der effizienteste Weg, um dies zu erreichen, es ist für (relative) Klarheit geschrieben. Sie betrachten auch den erheblichen Leistungsnachteil jedes Texturlesens, das abhängig ist (dh die GPU kann die Zugriffe außerhalb des Fragment-Shaders nicht vorhersagen, was zu erheblichen Pipeline-Schwierigkeiten führt). Aber das ist gegen alle Kosten abzuwägen, die Sie aufwenden müssten, um etwas anderes als 3D-Texturkarten zu verwenden.

Beachten Sie auch, dass Sie einen Zugriff ausführen, der an ein bestimmtes z-Segment gebunden ist. Sie sind also auf das GL_NEAREST -Typ-Sampling in mindestens einer Dimension beschränkt, es sei denn, Sie möchten zwei Samples machen und das Ergebnis selbst zu noch höheren Kosten mischen. Ich habe auch nichts mit Klammern zu tun, die Sie möglicherweise ansprechen möchten.

Datenwolf (+1, übrigens) ist auch völlig richtig, weil das Mipmapping ein Problem ist; Am Ende habe ich es einfach deaktiviert.

Ende 2013 Nachtrag: zum Zeitpunkt des Schreibens, iOS 7, das iPhone 5s, die zweite Generation iPad Mini und das iPad Air alle unterstützen ES 3.0. 3.0 führt das Ziel GL_TEXTURE_3D ein. So können Sie 3D-Texturen direkt auf diesen Geräten und wahrscheinlich allen zukünftigen iOS-Geräten verwenden. Und für die Aufzeichnung, es sieht ähnliche Verfügbarkeit auf Android, in allen neusten Nexus-Geräten, dem HTC One, einigen der jüngsten Samsungs und andere unterstützt worden.

    
Tommy 11.02.2012 16:17
quelle
2
  

Ich kann nicht finden, dass es glTexImage3D Funktion in OpenGL ES 2

gibt

Weil 3D-Texturen von OpenGL-ES nicht unterstützt werden. Denken Sie darüber nach: Eine 3D-Textur benötigt viel mehr Speicher als eine 2D-Textur. Und Speicher ist eine sehr knappe Ressource auf eingebetteten / mobilen Geräten, auf die ES ausgerichtet ist.

  

Ich denke, vielleicht jemand kennt den Algorithmus der Verwendung von 3D-Textur?

Es ist nicht so sehr ein algorithmisches Problem, sondern eines der begrenzten Ressourcen. Theoretisch könnten Sie mehrere Textureinheiten / Sampler verwenden, um Layer dort hochzuladen und eine Interpolation im Shader durchzuführen. Aber das würde Tiefe Mipmaping fehlen.

  

3D Textur, zB: .tag Datei?

TAG-Datei? Entschuldigung, mir ist dieses Format nicht bekannt. Könnten Sie mir einen Link geben, um es zu lesen? Google hat keine nützlichen Informationen dazu gefunden. Hast du vielleicht TGA gemeint?

    
datenwolf 11.02.2012 16:07
quelle