如何使用glReadPixels获取浮点值? [Android NDK es3.0]

时间:2015-07-03 03:54:51

标签: android opengl-es android-ndk opengl-es-3.0

c ++代码:

float* data = (float*)malloc(texWidth*texHeight*sizeof(float)); // or GLfloat
float* result = (float*)malloc(texWidth*texHeight*sizeof(float)); // or GLfloat
for (int i = 0; i < texWidth * texHeight; i++) {
    data[i] = 2.22;
}
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
...
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
...
glReadPixels(0, 0, texWidth, texHeight, GL_RGBA, GL_UNSIGNED_BYTE, result);
for (int i = 0; i < 64; i++) {
    LOGD("%f", result[i]);
}

现在我想读取值&#34; 2.22&#34;回来了,但现在我得到的是一些长浮动值。 (输出类似于-188856716075009999660373357998301511680.000000,不是我想要的)。

我也尝试使用GLubyte作为结果数组的类型,得到颜色值(结果[0]是R值,结果[1]是G值,结果[2]是B值,结果[3] ]是A值),这不是我想要的。

问题:

  1. 由于类型是GL_UNSIGNED_BYTE,我应该使用GLubyte作为我的数组类型吗?
  2. 如何通过glReadPixels完全获得2.22?
  3. GL_FLOAT可以是GLES中glReadPixels的类型吗?

1 个答案:

答案 0 :(得分:0)

  1. 是。回读格式必须与纹理格式匹配。
  2. 你不能,因为你没有回读浮动数据。您必须自己从字节值重建它。
  3. 是的,如果纹理是浮动格式纹理(OpenGL ES 3.0以后)