首先提出一個公式,yuv轉換為rgb的公式:
如果把 RGB 和YUV 的範圍都放縮到 [0,255][0,255],那麼常用的轉換公式是這樣的。
static const char* S_f_shader_yuv4xx1 =
"varying lowp vec2 v_texCoord;\
uniform sampler2D tex_y;\
uniform sampler2D tex_u;\
uniform sampler2D tex_v;\
void main(void)\
{\
float r, g, b, y, u, v;\
y = texture2D(tex_y, v_texCoord).r;\
u = texture2D(tex_u, v_texCoord).r - 0.5;\
v = texture2D(tex_v, v_texCoord).r - 0.5;\
r = y + 1.13983*v;\
g = y - 0.39465*u - 0.58060*v;\
b = y + 2.03211*u;\
gl_FragColor = vec4(r, g, b, 1.0);\
}";
如果為NV12,其排列方式為Y集中排列,UV交錯排列
YYYYUVUV
根據這種交錯的性質,UV當成一個整體來看,則恰好是Y的1/2,讓其寬度增大2倍,則恰好模擬情形應該如下:
A R G B
U0 V0 U0 V0
所以需要將UV作為一個整體,給OpenGL,設定寬度為width/2,高度為height,則R為V0,A為U0
static const char* S_f_shader_nv12 =
"precision highp float;\
varying vec2 v_texCoord;\
uniform sampler2D tex_y;\
uniform sampler2D tex_u;\
void main (void){\
float r, g, b, y, u, v;\
y = texture2D(tex_y, v_texCoord).r;\
u = texture2D(tex_u, v_texCoord).a - 0.5;\
v = texture2D(tex_u, v_texCoord).r - 0.5;\
r = y + 1.13983*v;\
g = y - 0.39465*u - 0.58060*v;\
b = y + 2.03211*u;\
gl_FragColor = vec4(r, g, b, 1.0);\
}";