android – 片段着色器的YUV到RGB转换

前端之家收集整理的这篇文章主要介绍了android – 片段着色器的YUV到RGB转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Android中将相机预览从YUV格式转换为RGB时遇到了问题.转换的目的是应用一些效果.我尝试通过片段着色器进行转换,因为本机代码的转换很慢(大约14fps).我使用的参考是 http://jyrom.tistory.com/m/post/view/id/187.我尝试将此代码移植到Android平台,但结果是黑绿色矩形.但是,我可以通过输出看到某种形式.你可以试着帮我解决这个问题吗?我相信这是一个很受欢迎的问题:将效果应用于相机预览.我还提供了我的测试项目链接https://dl.dropbox.com/u/12829395/application/FilterGL/FilterGL.zip.
谢谢.

更新:

这是我的onPreviewFrame方法

  1. public void onPreviewFrame(byte[] data,Camera camera) {
  2. yBuffer.put(data);
  3. yBuffer.position(0);
  4.  
  5. System.arraycopy(data,U_INDEX,uData,LENGTH_4 * 2);
  6. uBuffer.put(uData);
  7. uBuffer.position(0);
  8.  
  9. System.arraycopy(data,V_INDEX,vData,LENGTH_4);
  10. vBuffer.put(vData);
  11. vBuffer.position(0);
  12. }

这是我在onDrawFrame方法中将字节数组绑定到OpenGL纹理的方法

  1. GLES20.glUniform1i(yTexture,1);
  2. GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D,GLES20.GL_LUMINANCE,320,240,GLES20.GL_UNSIGNED_BYTE,yBuffer);
  3. GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
  4. GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
  5.  
  6. GLES20.glUniform1i(uTexture,2);
  7. GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D,160,120,uBuffer);
  8. GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_LINEAR);
  9.  
  10. GLES20.glUniform1i(vTexture,3);
  11. GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D,vBuffer);
  12. GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_LINEAR);

这是我的片段着色器代码

  1. #ifdef GL_ES
  2. precision highp float;
  3. #endif
  4.  
  5. varying vec2 v_texCoord;
  6. uniform sampler2D y_texture;
  7. uniform sampler2D u_texture;
  8. uniform sampler2D v_texture;
  9.  
  10. void main()
  11. {
  12. float nx,ny,r,g,b,y,u,v;
  13. nx=v_texCoord.x;
  14. ny=v_texCoord.y;
  15. y=texture2D(y_texture,v_texCoord).r;
  16. u=texture2D(u_texture,v_texCoord).r;
  17. v=texture2D(v_texture,v_texCoord).r;
  18.  
  19. y=1.1643*(y-0.0625);
  20. u=u-0.5;
  21. v=v-0.5;
  22.  
  23. r=y+1.5958*v;
  24. g=y-0.39173*u-0.81290*v;
  25. b=y+2.017*u;
  26.  
  27. gl_FragColor = vec4(r,1.0);
  28. }

解决方法

不确定你是否已经解决了这个问题.我的回答

>默认情况下,相机输出为NV12,但在片段着色器YUV到RGB中,您使用的是YV12 – > RGB.
你必须这样做
setPreviewFormat(ImageFormat.YV12);或者可能使用其他一些着色器
>有3种纹理,确保你这样做

GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,muTextureName)

调用任何glTexImage2D之前.和glTexSubImage2D
>您还可以在每个帧和glTexImage2D上使用glTexSubImage2D一次.
> U和V的大小相同,至少为YV12,

System.arraycopy(data,LENGTH_4 * 2);

应该System.arraycopy(data,LENGTH_4);在代码中相应地更改大小.

猜你在找的Android相关文章