2017-10-08 13 views
1

Wenn ich die Textur GL_HALF_FLOAT_OES verwende; Der Fragment-Shader scheint gut zu schreiben und ich kann beobachten, dass er die richtigen Werte hat, wenn ich gpuTrace in xCode verwende. Aber als ich es lasGL_HALF_FLOAT_OES und glReadPixels

glReadPixels(0, 0, self.imageSize->v[0], self.imageSize->v[1], GL_RGBA, type, pixels); 

Die Pixel-Komponenten entweder schwimmend verwenden zurück -0 oder 1. Floating Ist dies, weil die Float-Werte unerwartet abgeschnitten zu werden? Gibt es eine Möglichkeit, die Float-Werte so zu lesen, wie sie ursprünglich geschrieben wurden? Wenn ich GL_RGBA16F_EXT oder GL_RGBA32F_EXT anstelle von GL_RGBA benutze, bekomme ich ungültige enum.

Basierend auf dem Feedback von Rabbid76

int formatExt, typeExt; 
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &formatExt); 
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &typeExt); 

[ self traceLog:[ NSString stringWithFormat:@"Implementation format is %@, type is %@", [ TextureImage strForFormat:formatExt ], [ TextureImage strForType:typeExt ] ] ]; 

Die zurückgegebenen Werte sind "Implementation Format GL_RGBA ist, Typ GL_HALF_FLOAT_OES". Was wahrscheinlich bedeutet, dass HALF_FLOAT der einzige Wert ist, den es zurücklesen kann. Ich untersuche noch, ob es möglich wäre, GL_FLOAT zurückzulesen, weil glReadPixels ungeachtet dessen, was glGetIntegerv zurückgibt, GL_FLOAT nicht mit ungültiger Enum kennzeichnet; es akzeptiert und verarbeitet es, aber die Schwimmer sind nicht etwas, das scheint, die richtigen Schwimmer zu sein; Es scheint also einige unerwartete Konvertierungen zu geben.

Antwort

1

finden Sie in der Dokumentation von glReadPixels (OpenGL ES 3.1) die sagt:

void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data);

format
Gibt das Format der Pixeldaten. Die folgenden symbolischen Werte werden akzeptiert: GL_RGBA und GL_RGBA_INTEGER. Ein von der Implementierung gewähltes Format wird ebenfalls akzeptiert. Dies kann mit glGet und GL_IMPLEMENTATION_COLOR_READ_FORMAT abgefragt werden.
type
Gibt den Datentyp der Pixeldaten an. Muss einer von GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_2_10_10_10_REV, GL_INT oder GL_FLOAT sein. Ein von der Implementierung gewählter Typ wird ebenfalls akzeptiert. Dies kann mit glGet und GL_IMPLEMENTATION_COLOR_READ_TYPE abgefragt werden.


Dies bedeutet, dass Sie die Umsetzung gewählte format und type zu lesen, haben die Float-Werte zurück zu lesen, wie sie ursprünglich geschrieben wurden:

int format = glGet(GL_IMPLEMENTATION_COLOR_READ_FORMAT); 
int type = glGet(GL_IMPLEMENTATION_COLOR_READ_TYPE); 
glReadPixels( 
    0, 0, self.imageSize->v[0], self.imageSize->v[1], 
    format, type, pixels); 


die Dokumentation von glGet (OpenGL ES 3.1) Siehe:

GL_IMPLEMENTATION_COLOR_READ_FORMAT params retu rns einen Wert, das Format, das von der Implementierung gewählt wurde, in der Pixel aus dem Farbpuffer des aktuell gebundenen Framebuffers gelesen werden können.

GL_IMPLEMENTATION_COLOR_READ_TYPE params liefert einen Wert zurück, die Art der Implementierung gewählt, mit den Pixeln aus dem Farbpuffer gelesen werden des aktuell gebunden Framebuffer können.

Verwandte Themen