色彩的二次抽樣
在RGB顏色模式下,每個(gè)像素點(diǎn)由Red瓷马、Green拴还、Blue三種顏色組合而成,YUV使用色彩通道UV和亮度通道Y欧聘,這種格式更適合圖像處理領(lǐng)域片林,圖片的所有細(xì)節(jié)保存在亮度通道中,如果沒有亮度怀骤,圖片就是一張灰度圖片费封,人的眼睛對亮度的敏感度要高于顏色,所以可以通過減少每個(gè)像素點(diǎn)的顏色值晒喷,達(dá)到效果比較好的壓縮孝偎,這個(gè)減少顏色數(shù)據(jù)的過程就是色彩的二次抽樣
YUV轉(zhuǎn)RGB繪制紋理
紋理映射只能在RGBA方式下執(zhí)行,攝像頭采集YUV凉敲,需要把YUV轉(zhuǎn)換成RGBA
- 獲取到視頻幀的YUV數(shù)據(jù)
- CoreVideo進(jìn)行分離Y分量和UV分量
- Fragment Shader對Y分量和UV分量進(jìn)行采樣
- Fragment Shader轉(zhuǎn)換YUV到RGB
- 進(jìn)行渲染
看一下BT.601的RGB到Y(jié)UV的轉(zhuǎn)換算法
R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
G' = 1.164*(Y’-16) - 0.392*(Cb'-128) - 0.813*(Cr'-128)
B' = 1.164*(Y’-16) + 2.017*(Cb'-128)
// 其中括號(hào)里面的是做伽馬矯正用的
所以我們的轉(zhuǎn)換矩陣可以這樣寫
mat3( 1.164, 1.164, 1.164,
0.0, -0.392, 2.017,
1.596, -0.813, 0.0,)
Fragment Shader中的轉(zhuǎn)換下面這樣寫
varying highp vec2 texCoordVarying;
precision mediump float;
uniform sampler2D SamplerY;
uniform sampler2D SamplerUV;
uniform mat3 colorConversionMatrix;
void main() {
mediump vec3 yuv;
lowp vec3 rgb;
yuv.x = (texture2D(SamplerY, texCoordVarying).r);// - (16.0/255.0));
yuv.yz = (texture2D(SamplerUV, texCoordVarying).ra - vec2(0.5, 0.5));
rgb = colorConversionMatrix * yuv;
gl_FragColor = vec4(rgb, 1);
}