2015-06-03 99 views
1

我正在研究Android上的openGL es。 现在我遇到了一个问题。我定义了一个浮点数组,用于传递给片段着色器。我如何通过glReadPixels读取数据?

float[] data = new float[texWidth*texHeight]; 
// test data 
for (int i = 0; i < data.length; i++) { 
    data[i] = 0.123f; 
} 

1. initTexture:

glGenTextures... 
glBindTexture... 
glTexParameteri... 
FloatBuffer fb = BufferUtils.array2FloatBuffer(data); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, fb); 

2.FBO:

glGenBuffers... 
glBindFramebuffer... 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0); 

3.onDrawFrame:

glUseProgram(mProgram);... 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);... 

IntBuffer fb = BufferUtils.iBufferAllocateDirect(texWidth*texHeight); 
glReadPixels(0, 0, texWidth, texHeight, GL_RGBA, GL_UNSIGNED_BYTE, fb); 
System.out.println(Integer.toHexString(fb.get(0))); 
System.out.println(Integer.toHexString(fb.get(1))); 
System.out.println(Integer.toHexString(fb.get(2))); 

片段着色器:

precision mediump float; 
uniform sampler2D sTexture; 
varying vec2 vTexCoord; 

void main() 
{ 
    tex = texture2D(sTexture, vTexCoord.st); 
    vec4 color = tex; 
    gl_FragColor = color; 
} 

那么,我怎么能得到浮动数据(0.123f,我之前定义)whith glReadPixels?现在我得到的是ff000000(ABGR),所以我怀疑着色器没有通过这种方式获取数据。有人能告诉我为什么以及如何处理它?我是一个新手,真的很感激它。

回答

0

您的主要问题发生在glReadPixels()之前。首要的问题是你用glTexImage2D()方式:

FloatBuffer fb = BufferUtils.array2FloatBuffer(data); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, fb); 

为第8个参数的GL_UNSIGNED_BYTE值指定传入的数据包括的无符号字节。但是,缓冲区中的值是浮点数。所以你的float值被解释为字节,不可能很好地结束,因为它们是完全不同的格式,具有不同的大小和内存布局。现在

,你可能会想这样做,而不是:

FloatBuffer fb = BufferUtils.array2FloatBuffer(data); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, 
      GL_RGBA, GL_FLOAT, fb); 

这将在桌面上的OpenGL,支持隐格式转换为指定的纹理数据的一部分工作。但在OpenGL ES中支持的是而不是。在ES 2.0中,GL_FLOAT甚至不是格式参数的合法值。在ES 3.0中,这是合法的,但只适用于实际存储浮动内容的内部格式,例如GL_RGBA16FGL_RGBA32F。将它与GL_RGBA内部格式(第三个参数)组合使用时出错。

因此,除非在ES 3.0中使用浮点纹理(消耗更多内存),否则需要将原始数据转换为字节。如果你的浮点值在0.0到1.0之间,你可以通过将它们乘以255来完成,并舍入到下一个整数。

然后,您可以将它们读回为glReadPixels()的字节,并且应该再次获取相同的值。

+0

谢谢! :)我遵循你的建议,并改为ES 3.0。它现在工作! – KiBa1215

相关问题