4 个版本
0.0.4 | 2021 年 11 月 6 日 |
---|---|
0.0.3 | 2021 年 10 月 18 日 |
0.0.2 | 2021 年 10 月 17 日 |
0.0.1 | 2021 年 10 月 11 日 |
#691 in 图形 API
3.5MB
5K SLoC
wgpu-rust-renderer
wgpu-rust-renderer
是用 Rust 编写的微型 WebGPU 渲染器。
演示
Rust 代码使用 wasm-bindgen 编译成 WebAssembly,并在网页浏览器中运行。
屏幕截图
桌面应用程序。
网页应用程序。
功能
- 微型 WebGPU 渲染库
- 易于使用
- Rust 保证内存安全
- 支持 glTF
- 基于节点的材质系统具有良好的灵活性和可扩展性
- 通过编译成 WebAssembly 与网页应用程序兼容
文档
待定
示例代码
use winit::{
event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop},
window::Window,
};
use wgpu_rust_renderer::{
math::color::Color,
renderer::wgpu_renderer::{
WGPURenderer,
WGPURendererOptions,
},
resource::resource::{
ResourceId,
ResourcePools,
},
scene::{
camera::PerspectiveCamera,
mesh::Mesh,
node::Node,
scene::Scene,
},
utils::{
geometry_helper::GeometryHelper,
material_helper::MaterialHelper,
},
};
fn create_scene(
window: &Window,
pools: &mut ResourcePools,
) -> (ResourceId<Scene>, ResourceId<Camera>) {
let mut scene = Scene::new();
let geometry = GeometryHelper::create_triangle(
pools,
1.0,
1.0,
);
let material = MaterialHelper::create_basic_material(
pools,
Color::set(&mut Color::create(), 1.0, 0.0, 0.0),
);
let mesh = pools.borrow_mut::<Mesh>()
.add(Mesh::new(geometry, material));
let node = pools.borrow_mut::<Node>()
.add(Node::new());
scene.add_node(&node);
scene.assign(&node, &mesh);
let window_size = window.inner_size();
let camera = pools.borrow_mut::<PerspectiveCamera>().add(
PerspectiveCamera::new(
60.0_f32.to_radians(),
window_size.width as f32 / window_size.height as f32,
0.1,
1000.0,
),
);
let mut node = Node::new();
node.borrow_position_mut()[2] = 1.0;
let node = pools.borrow_mut::<Node>().add(node);
scene.add_node(&node);
scene.assign(&node, &camera);
(pools.borrow_mut::<Scene>().add(scene), camera)
}
fn resize(
renderer: &mut WGPURenderer,
pools: &mut ResourcePools,
camera: &ResourceId<PerspectiveCamera>,
width: u32,
height: u32,
) {
pools
.borrow_mut::<PerspectiveCamera>()
.borrow_mut(camera)
.unwrap()
.set_aspect(width as f32 / height as f32);
renderer.set_size(width as f64, height as f64);
}
fn update(
pools: &mut ResourcePools,
scene: &ResourceId<Scene>,
) {
pools.borrow::<Scene>()
.borrow(scene)
.unwrap()
.update_matrices(pools);
}
fn render(
renderer: &mut WGPURenderer,
pools: &ResourcePools,
scene: &ResourceId<Scene>,
camera: &ResourceId<PerspectiveCamera>,
) {
renderer.render(pools, scene, camera);
}
#[tokio::main]
async fn main() {
let event_loop = EventLoop::new();
let window = Window::new(&event_loop).unwrap();
let window_size = window.inner_size();
let pixel_ratio = window.scale_factor();
let mut renderer = WGPURenderer::new(
&window,
WGPURendererOptions::default(),
).await;
renderer.set_size(window_size.width as f64, window_size.height as f64);
renderer.set_pixel_ratio(pixel_ratio);
let mut pools = ResourcePools::new();
let (scene, camera) = create_scene(&window, &mut pools);
event_loop.run(move |event, _, control_flow| {
*control_flow = ControlFlow::Wait;
match event {
Event::WindowEvent {
event: WindowEvent::Resized(size),
..
} => {
resize(&mut renderer, &mut pools, &camera, size.width, size.height);
update(&mut pools, &scene);
render(&mut renderer, &mut pools, &scene, &camera);
},
Event::RedrawRequested(_) => {
update(&mut pools, &scene);
render(&mut renderer, &mut pools, &scene, &camera);
},
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => {
*control_flow = ControlFlow::Exit;
},
_ => {}
}
});
}
如何导入
该库在 crates.io 发布。将以下行添加到您的 Rust 项目的 Cargo.toml 文件中。
[dependencies]
wgpu_rust_renderer = "0.0.3"
并在您的 Rust 代码中添加以下行以导入库。
use wgpu_rust_renderer::{
geometry::{
attribute::Attribute,
geometry::Geometry,
index::Index,
},
material::material::Material,
resource::resource::{
ResourceId,
ResourcePools,
},
scene::{
camera::PerspectiveCamera,
mesh::Mesh,
node::Node,
scene::Scene,
},
web::wgpu_web_renderer::WGPUWebRenderer, // for web
renderer::wgpu_renderer::{
WGPURenderer, // for others
WGPURendererOptions,
},
};
如何本地构建库
$ git clone https://github.com/takahirox/wgpu-rust-renderer.git
$ cd wgpu-rust-renderer
$ cargo build
如何本地运行桌面示例
$ cd wgpu-rust-renderer
$ cargo run --example example_name
如何本地运行网页示例
先决条件
- 安装 wasm-bindgen 客户端
- 使用
$ rustup target add wasm32-unknown-unknown
安装 Rust wasm32-unknown-unknown 目标 - 使用
$ npm install -g http-server
安装http-server
,或使用其他本地服务器
$ cd wgpu-rust-renderer/web
$ bash build_examples.sh
$ http-server . -p 8080 -c-1
# Access https://127.0.0.1:8080/examples/index.html on your web browser
如何运行测试
待定
依赖项
~5–21MB
~295K SLoC