2017-10-08 112 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 返回一個值,通過與像素可以從顏色緩衝器中的當前綁定幀緩衝區
被讀取的實現選擇的類型。