2016-09-21 4 views
0

Also habe ich diese Codezeile haben:glTexImage2D Fehler Feinheiten zwischen iOS, Android- inkonsistente Dokumentation

glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,shadow_tex_dim.x,shadow_tex_dim.y,0,GL_DEPTH_COMPONENT,GL_FLOAT,shadow_texture_data);

, die eine Tiefe Textur zu etablieren auf Android funktioniert gut (Lauf OpenGLES2) (und OSX).

Wenn ich es in iOS (iOS 10, auch OpenGLES2) läuft, gibt glGetError()GL_INVALID_OPERATION zurück. (glGetError(), kurz bevor diese Zeile sauber zurückkehrt).

Hier ist die Dokumentation für glTexImage2D: http://docs.gl/es2/glTexImage2D

Beachten Sie, dass 'internalformat' gibt an, dass die einzigen gültigen Argumente sind "GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA", aber unten im Abschnitt "Beispiele", es zeigt glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT , fbo_width, fbo_height, 0, GL_DEPTH_COMPONENT , GL_UNSIGNED_BYTE , NULL); (die zu meinen aktuellen Zeilen sehr ähnlich ist, aber mit GL_UNSIGNED_BYTE statt GL_FLOAT.

Also, darf ich GL_DEPTH_COMPONENT verwenden? Warum funktioniert das auf Android OpenGLES2, und nicht iOS? Woher bekomme ich, dass ich GL_FLOAT verwenden sollte (beachten Sie, dass sich das Verhalten weder bei iOS noch bei android irgendwie zu ändern scheint ...)?

Antwort

1

Apple Support für die Tiefen Texturen hier definiert werden würde: https://www.khronos.org/registry/gles/extensions/OES/OES_depth_texture.txt

Aus der Dokumentation gibt es zwei Bereiche, die relevant sind:

Texturen mit und Werte von DEPTH_COMPONENT auf eine Textur beziehen, die Tiefe enthält Komponentendaten. wird verwendet, um die Anzahl der Bits zu bestimmen, die zum Angeben von Texel-Tiefenwerten verwendet werden.

Ein Wert von UNSIGNED_SHORT bezieht sich auf einen 16-Bit-Tiefenwert. Ein Wert von UNSIGNED_INT bezieht sich auf einen 32-Bit-Tiefenwert.

und

Der Fehler INVALID_OPERATION erzeugt wird und wenn die DEPTH_COMPONENT ist und nicht UNSIGNED_SHORT oder UNSIGNED_INT.

Dies ist auch interessant: https://www.opengl.org/wiki/Common_Mistakes

In OpenGL alle Tiefenwerte liegen im Bereich [0, 1]. Der ganzzahlige Normalisierungsprozess wandelt diesen Gleitkommabereich einfach in ganzzahlige Werte mit der entsprechenden Genauigkeit um. Es ist der ganzzahlige Wert , der im Tiefenpuffer gespeichert ist.

Typischerweise, 24-Bit-Tiefenpuffer wird Pad jeder Tiefenwert, um 32 Bits, also 8 Bit pro Pixel werden ungenutzt.Wenn Sie jedoch nach einem 8-Bit Stencil Buffer zusammen mit dem Tiefenpuffer fragen, werden die beiden separaten Bilder in der Regel zu einem einzelnen Tiefen-/Schablonenbild kombiniert. 24 Bits werden für die Tiefe und die restlichen 8 Bits für die Schablone verwendet.

Nun, da das Missverständnis über Tiefenpuffer Gleitkomma ist gelöst, was ist falsch mit diesem Aufruf?

glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, my pixels);

Da die Tiefe Format ist ein normalisierter Integer-Format, der Fahrer muss die CPU verwenden, um die normalisierten Daten in ganzzahligen Gleitkommawerte zu konvertieren. Das ist langsam.

Es scheint, dass Android GL_FLOAT Typen für Tiefenstruktur unterstützt.