2017-10-08 71 views
1

当我使用GL_HALF_FLOAT_OES纹理时;片段着色器似乎写入它很好,我可以观察到它具有正确的值,当我在xCode中使用gpuTrace。但是,当我读回用GL_HALF_FLOAT_OES和glReadPixels

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

像素组件也可以浮动-0或浮动1.这是因为浮点值越来越意外修剪?有没有一种方法可以回读浮动值的原始写法?如果我使用GL_RGBA16F_EXTGL_RGBA32F_EXT而不是GL_RGBA,则会得到无效的枚举。

意见的基础上,从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 ] ] ]; 

返回的值是 “实施格式GL_RGBA,类型是GL_HALF_FLOAT_OES”。这可能意味着HALF_FLOAT是它能够读回的唯一值。我仍在调查是否有可能回读GL_FLOAT,因为尽管glGetIntegerv返回glReadPixels不会将GL_FLOAT标记为无效的Enum;它接受并处理它,但浮动并不是正确的浮动;所以它似乎在做一些意想不到的转换。

回答

1

glReadPixels (OpenGL ES 3.1)它说的文档:

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

format
指定像素数据的格式。接受以下符号值:GL_RGBAGL_RGBA_INTEGER。实施选择的格式也将被接受。这可以通过glGetGL_IMPLEMENTATION_COLOR_READ_FORMAT查询。

type
指定像素数据的数据类型。必须是GL_UNSIGNED_BYTE,GL_UNSIGNED_INT,GL_UNSIGNED_INT_2_10_10_10_REV,GL_INTGL_FLOAT之一。实施选择类型也将被接受。这可以通过glGetGL_IMPLEMENTATION_COLOR_READ_TYPE查询。


这意味着你要读的实施,选择formattype,回读浮点值,因为他们最初写:

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); 


glGet (OpenGL ES 3.1)的文档:

GL_IMPLEMENTATION_COLOR_READ_FORMAT params retu rns一个值,这是由实现选择的格式,其中可以从当前绑定的帧缓冲器的颜色缓冲器中读取像素。

GL_IMPLEMENTATION_COLOR_READ_TYPE PARAMS 返回一个值,通过与像素可以从颜色缓冲器中的当前绑定帧缓冲区
被读取的实现选择的类型。