2015-06-03 44 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