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();
}

代码说明

  1. 初始化流程:

    • 创建窗口和事件循环
    • 初始化macaw渲染器实例
    • 创建渲染器和表面(surface)
  2. 场景创建:

    • SimpleScene结构体包含相机、网格和变换
    • 使用透视相机,位置在(0,0,5),看向原点
    • 创建立方体基础网格
  3. 渲染循环:

    • 每帧清除为黑色背景
    • 设置渲染管线和绑定组
    • 更新相机视图投影矩阵
    • 绘制网格
    • 呈现帧

运行要求

  1. 在Cargo.toml中添加依赖:
[dependencies]
macaw = "0.5"
winit = "0.28"
tokio = { version = "1.0", features = ["full"] }
  1. 需要支持Vulkan/Metal/DirectX 12的显卡

这个示例展示了macaw的基本使用流程,包括初始化、场景设置和渲染循环。你可以在此基础上添加更多功能,如加载复杂模型、添加光照和材质、实现后处理效果等。

回到顶部