Используя простые привязки 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
.