我使用 OpenGL 着色器进行从 YUV 到 RGB 的颜色转换。例如,在 YUV420P 上,我创建了 3 个纹理(一个用于 Y,一个用于 U,一个用于 V)并使用texture
GLSL 调用来获取每个纹理。然后我使用矩阵乘法来获得 RGB 值。每个纹理都有 format GL_RED
,因为它们只存储 1 个组件。
这一切都适用于 C++。现在我正在使用安全的 OpenGL Rust 库 glium。我正在创建这样的纹理:
let mipmap = glium::texture::MipmapsOption::NoMipmap;
let format = glium::texture::UncompressedFloatFormat::U8;
let y_texture = glium::texture::texture2d::Texture2d::empty_with_format(&display, format, mipmap, width as u32, height as u32).unwrap();
let u_texture = glium::texture::texture2d::Texture2d::empty_with_format(&display, format, mipmap, (width as u32)/2, (height as u32)/2).unwrap();
let v_texture = glium::texture::texture2d::Texture2d::empty_with_format(&display, format, mipmap, (width as u32)/2, (height as u32)/2).unwrap();
看到U
和纹理的大小V
是 Y 纹理的 1/4,正如 YUV420P 所预期的那样。
如您所见,对于我选择的 YUV420P glium::texture::UncompressedFloatFormat::U8
,我认为与GL_RED
.
问题是我不知道如何用数据填充这个纹理。它的write
方法期望可以转换为RawImage2D
. 但是,所有填充方法都RawImage2D
需要 RGB 图像。
我需要一种方法来仅将 Y 填充到第一个纹理,然后仅将 U 填充到第二个纹理,并且仅将 V 填充到第三个纹理。