Как получить пиксели с заданного уровня c mipmap глия Texture2d? - PullRequest
0 голосов
/ 20 марта 2020

Используя простые привязки GL, относительно * легко получить данные пикселей с заданного c уровня mipmap текстуры, используя такой код, как

unsafe { gl::BindTexture(gl::TEXTURE_2D, tex_id); }
explode_if_gl_error()?;

let mut width:gl::types::GLint=0;
let mut height:gl::types::GLint=0;

unsafe { gl::GetTexLevelParameteriv(gl::TEXTURE_2D, mipmap_level, gl::TEXTURE_WIDTH, &mut width as *mut _); }
explode_if_gl_error()?;
unsafe { gl::GetTexLevelParameteriv(gl::TEXTURE_2D, mipmap_level, gl::TEXTURE_HEIGHT, &mut height as *mut _); }
explode_if_gl_error()?;

println!("mipmap {} is {}x{}", mipmap_level, width, height);

let mut rgbs = vec![0u8; (3*width*height) as usize];

unsafe { gl::GetTexImage(gl::TEXTURE_2D, mipmap_level, gl::RGB, gl::UNSIGNED_BYTE, rgbs.as_mut_ptr() as *mut _); }
explode_if_gl_error()?;

return Ok((rgbs, width as u32, height as u32));

Но теперь я пытаюсь понять как сделать это для Texture2d из глиняного ящика.

Я могу получить пиксели от основного уровня текстуры, используя

let pixel_buffer = out_tex.read_to_pixel_buffer();

let rgba:Vec<(u8,u8,u8,u8)> = pixel_buffer.read()?;

let mut rgbs= vec![0u8; 3*rgba.len()];
for (i, &(r,g,b,_a)) in rgba.iter().enumerate() {
    let base = i * 3;
    rgbs[base +0] = r;
    rgbs[base +1] = g;
    rgbs[base +2] = b;
}

Но я не нашел API, который позволил бы мне задать уровень mipmap для read_to_pixel_buffer ().

Я даже пытался перейти к GL API, но не могу понять, как загрузить привязки GL. Если я вызываю gl::BindTexture приложение на основе глия, которое паникует с

thread 'main' panicked at 'gl function was not loaded', /home/thoth/work/TandbergLabs/gst_gl_scene_change/glium_toy2/target/debug/build/gl-e43aa36c0ab7d6f3/out/bindings.rs:20624:13
stack backtrace:

Так что, что бы ни делал glium, он не инициализирует простой gl API. В структуре Display есть поле gl, но оно является приватным. Существует метод get_context() на Фасаде, который возвращает R c, который, по мнению IDEA, имеет метод с именем make_current(), но компилятор с этим не согласен (думаю, что его черта является частной). Если бы make_current() можно было использовать, я мог бы получить CommandContext с полем pub gl.

Итак, попробовав все это: я все еще не знаю, как извлечь данные пикселей RGB из указанного c уровень mipmap glium::texture::Texture2d.

...