首页 > 解决方案 > 如何在 glium 中填充非 RGB OpenGL 纹理?

问题描述

我使用 OpenGL 着色器进行从 YUV 到 RGB 的颜色转换。例如,在 YUV420P 上,我创建了 3 个纹理(一个用于 Y,一个用于 U,一个用于 V)并使用textureGLSL 调用来获取每个纹理。然后我使用矩阵乘法来获得 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 填充到第三个纹理。

标签: openglrustglium

解决方案


推荐阅读