Rust图形渲染库macaw的使用,macaw提供高性能3D渲染和图形处理功能
Rust图形渲染库macaw的使用
macaw是一个基于优秀glam
库构建的游戏数学库,提供高性能的3D渲染和图形处理功能。
安装
在您的项目目录中运行以下Cargo命令:
cargo add macaw
或者在您的Cargo.toml中添加以下行:
macaw = "0.30.0"
许可证
macaw采用以下双重许可证:
- Apache License, Version 2.0
- MIT license
示例代码
以下是一个使用macaw进行3D渲染的完整示例:
use macaw::{Mat4, Quat, Vec3};
fn main() {
// 创建一个变换矩阵
let translation = Vec3::new(1.0, 2.0, 3.0);
let rotation = Quat::from_rotation_y(std::f32::consts::PI / 4.0);
let scale = Vec3::new(1.0, 1.0, 1.0);
// 构建模型矩阵
let model = Mat4::from_scale_rotation_translation(scale, rotation, translation);
// 创建视图矩阵
let eye = Vec3::new(0.0, 0.0, 5.0);
let target = Vec3::ZERO;
let up = Vec3::Y;
let view = Mat4::look_at_rh(eye, target, up);
// 创建投影矩阵
let projection = Mat4::perspective_rh(
std::f32::consts::PI / 2.0,
16.0 / 9.0,
0.1,
100.0
);
// 计算MVP矩阵
let mvp = projection * view * model;
println!("MVP Matrix: {:?}", mvp);
// 示例向量变换
let point = Vec3::new(1.0, 0.0, 0.0);
let transformed_point = mvp.transform_point3(point);
println!("Transformed point: {:?}", transformed_point);
}
完整示例demo
以下是一个更完整的3D场景示例,展示了如何使用macaw进行更复杂的3D变换:
use macaw::{Mat4, Quat, Vec3, Vec4};
fn main() {
// 创建多个物体的变换矩阵
let objects = vec![
// 第一个物体
create_transform(
Vec3::new(1.0, 0.5, 2.0),
Quat::from_rotation_x(std::f32::consts::PI / 3.0),
Vec3::new(1.0, 1.0, 1.0)
),
// 第二个物体
create_transform(
Vec3::new(-1.0, 1.0, 3.0),
Quat::from_rotation_y(std::f32::consts::PI / 6.0),
Vec3::new(0.5, 0.5, 0.5)
),
// 第三个物体
create_transform(
Vec3::new(0.0, -1.0, 1.5),
Quat::from_rotation_z(std::f32::consts::PI / 4.0),
Vec3::new(1.5, 1.5, 1.5)
)
];
// 创建视图矩阵
let eye = Vec3::new(0.0, 0.0, 5.0);
let target = Vec3::ZERO;
let up = Vec3::Y;
let view = Mat4::look_at_rh(eye, target, up);
// 创建投影矩阵
let projection = Mat4::perspective_rh(
std::f32::consts::PI / 3.0, // 更宽的视野
16.0 / 9.0,
0.1,
100.0
);
// 处理每个物体
for (i, model) in objects.iter().enumerate() {
// 计算MVP矩阵
let mvp = projection * view * model;
println!("\nObject {} MVP Matrix:", i + 1);
println!("{:?}", mvp);
// 测试点变换
let test_point = Vec3::new(0.5, 0.5, 0.5);
let transformed = mvp.transform_point3(test_point);
println!("Test point transformed: {:?}", transformed);
// 提取旋转部分
let rotation = model.to_scale_rotation_translation().1;
println!("Rotation quaternion: {:?}", rotation);
}
}
// 辅助函数:创建变换矩阵
fn create_transform(translation: Vec3, rotation: Quat, scale: Vec3) -> Mat4 {
Mat4::from_scale_rotation_translation(scale, rotation, translation)
}
贡献
我们欢迎社区贡献这个项目。请阅读我们的贡献指南获取更多关于如何开始的信息。
文档
更多详细文档可以在官方文档站点找到。
1 回复
Rust图形渲染库macaw使用指南
介绍
macaw是一个高性能的Rust图形渲染库,专注于3D渲染和图形处理功能。它提供了现代图形API(如Vulkan和Metal)的抽象层,使开发者能够轻松创建复杂的3D图形应用程序。
macaw的主要特点包括:
- 跨平台支持(Windows/Linux/macOS)
- 基于wgpu构建,提供现代图形API抽象
- 高性能3D渲染管线
- 内置常用图形处理功能
- 简洁的Rust API设计
安装
在Cargo.toml中添加依赖:
[dependencies]
macaw = "0.5" # 请查看最新版本
完整示例代码
下面是一个完整的macaw示例,展示如何初始化渲染器、创建简单场景并运行渲染循环:
use macaw::prelude::*;
use winit::{
event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop},
window::WindowBuilder,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建窗口和事件循环
let event_loop = EventLoop::new();
let window = WindowBuilder::new()
.with_title("macaw示例")
.build(&event_loop)?;
// 初始化渲染器
let instance = RendererInstance::new().await?;
let surface = unsafe { instance.create_surface(&window) }?;
let mut renderer = RendererBuilder::new()
.with_default_pipeline()
.build(&instance, surface)
.await?;
// 创建简单场景
let scene = SimpleScene::new(&renderer);
// 运行事件循环
event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Poll;
match event {
Event::RedrawRequested(_) => {
// 渲染帧
render_frame(&mut renderer, &scene);
}
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => {
*control_flow = ControlFlow::Exit;
}
Event::MainEventsCleared => {
window.request_redraw();
}
_ => {}
}
});
}
// 简单场景结构体
struct SimpleScene {
camera: Camera,
mesh: Mesh,
transform: Transform,
}
impl SimpleScene {
fn new(renderer: &Renderer) -> Self {
// 创建相机
let camera = Camera::perspective(
Vec3::new(0.0, 0.0, 5.0), // 位置
Quat::IDENTITY, // 旋转
45.0f32.to_radians(), // 视野角度(转弧度)
0.1, // 近平面
100.0, // 远平面
);
// 创建立方体网格
let mesh = Mesh::cube(renderer);
// 设置变换
let transform = Transform {
position: Vec3::ZERO,
rotation: Quat::IDENTITY,
scale: Vec3::ONE,
};
Self { camera, mesh, transform }
}
}
// 渲染帧函数
fn render_frame(renderer: &mut Renderer, scene: &SimpleScene) {
// 开始新帧
let mut frame = renderer.begin_frame();
// 设置渲染通道描述符
let render_pass_desc = RenderPassDescriptor {
label: Some("main pass"),
color_attachments: &[Some(ColorAttachment {
view: frame.current_texture_view(),
resolve_target: None,
ops: Operations {
load: LoadOp::Clear(Color::BLACK), // 清除为黑色
store: true,
},
})],
depth_stencil_attachment: None,
};
// 开始渲染通道
let mut render_pass = frame.begin_render_pass(&render_pass_desc);
// 设置渲染管线
render_pass.set_pipeline(scene.mesh.pipeline());
render_pass.set_bind_group(0, &scene.mesh.bind_group());
// 更新并设置uniform缓冲区
let view_proj = scene.camera.view_proj_matrix();
render_pass.set_uniform_data(0, &view_proj.to_cols_array_2d());
// 绘制网格
scene.mesh.draw(&mut render_pass);
// 结束渲染通道并呈现帧
render_pass.end();
frame.present();
}
代码说明
-
初始化流程:
- 创建窗口和事件循环
- 初始化macaw渲染器实例
- 创建渲染器和表面(surface)
-
场景创建:
SimpleScene
结构体包含相机、网格和变换- 使用透视相机,位置在(0,0,5),看向原点
- 创建立方体基础网格
-
渲染循环:
- 每帧清除为黑色背景
- 设置渲染管线和绑定组
- 更新相机视图投影矩阵
- 绘制网格
- 呈现帧
运行要求
- 在Cargo.toml中添加依赖:
[dependencies]
macaw = "0.5"
winit = "0.28"
tokio = { version = "1.0", features = ["full"] }
- 需要支持Vulkan/Metal/DirectX 12的显卡
这个示例展示了macaw的基本使用流程,包括初始化、场景设置和渲染循环。你可以在此基础上添加更多功能,如加载复杂模型、添加光照和材质、实现后处理效果等。