我复制粘贴了一些我在stackoverflow上找到的代码,将默认的相机预览YUV转换为RGB格式,然后将其上传到OpenGL进行处理。效果很好,问题是大多数 CPU 都忙于将 YUV 图像转换为 RGB 格式,结果变成了瓶颈。
我想将 YUV 图像上传到 GPU 中,然后在片段着色器中将其转换为 RGB。我采用了相同的 Java YUV 到 RGB 函数,我发现它在 CPU 上工作,并试图让它在 GPU 上工作。
这变成了一场噩梦,因为在 Java 和 GPU 上进行计算存在一些差异。首先,预览图像在Java中是字节[],但是字节是有符号的,所以可能有负值。
此外,片段着色器通常处理 [0..1] 浮点值而不是字节。
我确信这是可以解决的,我几乎解决了。但是我花了几个小时试图弄清楚我做错了什么并且无法让它发挥作用。
最重要的是,我要求有人编写这个着色器函数并最好对其进行测试。对我来说,这将是一项乏味的猴子工作,因为我真的不明白为什么这种转换会以这种方式工作,我只是尝试在 GPU 上模仿相同的功能。
这与我在 Java 上使用的功能非常相似: Displaying YUV Image in Android
我在CPU上做了一些工作,比如把1.5*w h bytes的YUV格式转成aw h*YUV,如下:
static public void decodeYUV420SP(int[] rgba, byte[] yuv420sp, int width,
int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (int) yuv420sp[yp]+127;
if ((i & 1) == 0) {
v = (int)yuv420sp[uvp++]+127;
u = (int)yuv420sp[uvp++]+127;
}
rgba[yp] = 0xFF000000+(y<<16) | (u<<8) | v;
}
}
}
我添加了 127 因为字节已签名。然后我将 rgba 加载到 OpenGL 纹理中,并尝试在 GPU 上进行其余的计算。
任何帮助将不胜感激...