我正在尝试使用 egui 制作一个本机 GUI 应用程序。一段时间后,编译了hello_world 示例。
代码如下:
use eframe::{epi, egui};
struct MyEguiApp {
name: String,
age: u32,
}
impl Default for MyEguiApp {
fn default() -> Self {
Self {
name: "Arthur".to_owned(),
age: 42,
}
}
}
impl epi::App for MyEguiApp {
fn name(&self) -> &str {
"Test"
}
fn update(&mut self, ctx: &egui::Context, frame: &epi::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("My egui aplication");
ui.horizontal(|ui|{
ui.label("Your name: ");
ui.text_edit_singleline(&mut self.name);
});
ui.add(egui::Slider::new(&mut self.age,0..=120));
if ui.button("Click each year").clicked() {
self.age …Run Code Online (Sandbox Code Playgroud) 我一直在使用glow 在 Rust 中进行一些 opengl 渲染。进展顺利,但是渲染到纹理与渲染到图像给了我不同的结果。我知道一个简单的解决方法,但我只是不明白。
右侧的图像直接渲染到屏幕上,而左下角的图像是通过使用相同的绘制函数(将像素数据传递到 egui 的 ColorImage)将相同的网格渲染到相同大小的纹理来创建的。正如您所看到的,它太暗了,当我将像素数据保存到文件(使用 Rust 的 Image crate)时也是如此。
但是,如果渲染中通道的值已满,则输出中的通道值也已满,就像在转换为 RGB8 之前将 RGB 值在 0-1.0 范围内进行平方一样。果然,我尝试在像素数据 ( flipped_buffer[i1] = ((buffer[i2] as f32 / 255.).sqrt() * 255.).round() as u8;) 中撤消这一点,它开始看起来是正确的!
所以为什么?这是一个非常具体的事情,我什至可以想象它是映射颜色的一种有用的方式(因为眼睛比亮的值更好地区分较暗的值),但为什么会发生在这里?
写入纹理的代码基于此处的教程,但使用 Rust 中的发光而不是 C/C++,并使用 RGBA 而不是 RGB。
纹理创建摘录:
let gl_texture = self.gl.create_texture()?;
self.gl.bind_texture(glow::TEXTURE_2D, Some(gl_texture));
self.gl.tex_image_2d(glow::TEXTURE_2D, 0, glow::RGBA as i32, width as i32, height as i32, 0, glow::RGBA, glow::UNSIGNED_BYTE, None);
self.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
self.gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32); …Run Code Online (Sandbox Code Playgroud)