{"id":18638576,"url":"https://github.com/takahirox/wgpu-rust-renderer","last_synced_at":"2025-11-13T22:58:37.952Z","repository":{"id":48997616,"uuid":"412661495","full_name":"takahirox/wgpu-rust-renderer","owner":"takahirox","description":"A tiny WebGPU renderer written in Rust","archived":false,"fork":false,"pushed_at":"2022-10-21T03:37:55.000Z","size":11411,"stargazers_count":143,"open_issues_count":22,"forks_count":10,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-06T07:41:17.319Z","etag":null,"topics":["3dcg","graphics","rust","webassembly","webgpu","wgpu"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/takahirox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-10-02T01:33:01.000Z","updated_at":"2025-01-27T06:08:45.000Z","dependencies_parsed_at":"2022-08-31T01:24:29.929Z","dependency_job_id":null,"html_url":"https://github.com/takahirox/wgpu-rust-renderer","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takahirox%2Fwgpu-rust-renderer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takahirox%2Fwgpu-rust-renderer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takahirox%2Fwgpu-rust-renderer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takahirox%2Fwgpu-rust-renderer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/takahirox","download_url":"https://codeload.github.com/takahirox/wgpu-rust-renderer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247685634,"owners_count":20979085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3dcg","graphics","rust","webassembly","webgpu","wgpu"],"created_at":"2024-11-07T05:42:39.345Z","updated_at":"2025-11-13T22:58:32.916Z","avatar_url":"https://github.com/takahirox.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/takahirox/wgpu-rust-renderer.svg?branch=main)](https://travis-ci.org/takahirox/wgpu-rust-renderer)\n[![Crate](https://img.shields.io/crates/v/wgpu_rust_renderer.svg)](https://crates.io/crates/wgpu_rust_renderer)\n\n# wgpu-rust-renderer\n\n`wgpu-rust-renderer` is a tiny [WebGPU](https://www.w3.org/TR/webgpu/) Renderer written in Rust.\n\n## Demo\n\n[Online WebAssembly Demo](https://takahirox.github.io/wgpu-rust-renderer/web/examples/#triangle)\n\nRust code is compiled to WebAssembly with [wasm-bindgen](https://rustwasm.github.io/wasm-bindgen/) and it runs even in web browsers.\n\n## Screenshots\n\nDesktop application.\n\n\u003cimg src=\"./screenshots/desktop.png\" width=\"640\" alt=\"Desktop app\"\u003e\n\nWeb application.\n\n\u003cimg src=\"./screenshots/web.png\" width=\"640\" alt=\"Web app\"\u003e\n\n## Features\n\n* Tiny WebGPU Renderling library\n* Easy to use\n* Memory safe with Rust\n* [glTF](https://www.khronos.org/gltf/) support\n* Good flexibility and extensibility of materials with node-based material system\n* Web application compatible by compiling to WebAssembly\n\n## Documentation\n\nT.B.D.\n\n## Sample Code\n\n```rust\nuse winit::{\n  event::{Event, WindowEvent},\n  event_loop::{ControlFlow, EventLoop},\n  window::Window,\n};\nuse wgpu_rust_renderer::{\n  math::color::Color,\n  renderer::wgpu_renderer::{\n    WGPURenderer,\n    WGPURendererOptions,\n  },\n  resource::resource::{\n    ResourceId,\n    ResourcePools,\n  },\n  scene::{\n    camera::PerspectiveCamera,\n    mesh::Mesh,\n    node::Node,\n    scene::Scene,\n  },\n  utils::{\n    geometry_helper::GeometryHelper,\n    material_helper::MaterialHelper,\n  },\n};\n\nfn create_scene(\n  window: \u0026Window,\n  pools: \u0026mut ResourcePools,\n) -\u003e (ResourceId\u003cScene\u003e, ResourceId\u003cPerspectiveCamera\u003e) {\n  let mut scene = Scene::new();\n\n  let geometry = GeometryHelper::create_triangle(\n    pools,\n    1.0,\n    1.0,\n  );\n\n  let material = MaterialHelper::create_basic_material(\n    pools,\n    Color::set(\u0026mut Color::create(), 1.0, 0.0, 0.0),\n  );\n\n  let mesh = pools.borrow_mut::\u003cMesh\u003e()\n    .add(Mesh::new(geometry, material));\n  let node = pools.borrow_mut::\u003cNode\u003e()\n    .add(Node::new());\n  scene.add_node(\u0026node);\n  scene.assign(\u0026node, \u0026mesh);\n\n  let window_size = window.inner_size();\n  let camera = pools.borrow_mut::\u003cPerspectiveCamera\u003e().add(\n    PerspectiveCamera::new(\n      60.0_f32.to_radians(),\n      window_size.width as f32 / window_size.height as f32,\n      0.1,\n      1000.0,\n    ),\n  );\n\n  let mut node = Node::new();\n  node.borrow_position_mut()[2] = 1.0;\n\n  let node = pools.borrow_mut::\u003cNode\u003e().add(node);\n  scene.add_node(\u0026node);\n  scene.assign(\u0026node, \u0026camera);\n\n  (pools.borrow_mut::\u003cScene\u003e().add(scene), camera)\n}\n\nfn resize(\n  renderer: \u0026mut WGPURenderer,\n  pools: \u0026mut ResourcePools,\n  camera: \u0026ResourceId\u003cPerspectiveCamera\u003e,\n  width: u32,\n  height: u32,\n) {\n  pools\n    .borrow_mut::\u003cPerspectiveCamera\u003e()\n    .borrow_mut(camera)\n    .unwrap()\n    .set_aspect(width as f32 / height as f32);\n  renderer.set_size(width as f64, height as f64);\n}\n\nfn update(\n  pools: \u0026mut ResourcePools,\n  scene: \u0026ResourceId\u003cScene\u003e,\n) {\n  pools.borrow::\u003cScene\u003e()\n    .borrow(scene)\n    .unwrap()\n    .update_matrices(pools);\n}\n\nfn render(\n  renderer: \u0026mut WGPURenderer,\n  pools: \u0026ResourcePools,\n  scene: \u0026ResourceId\u003cScene\u003e,\n  camera: \u0026ResourceId\u003cPerspectiveCamera\u003e,\n) {\n  renderer.render(pools, scene, camera);\n}\n\n#[tokio::main]\nasync fn main() {\n  let event_loop = EventLoop::new();\n  let window = Window::new(\u0026event_loop).unwrap();\n\n  let window_size = window.inner_size();\n  let pixel_ratio = window.scale_factor();\n\n  let mut renderer = WGPURenderer::new(\n    \u0026window,\n    WGPURendererOptions::default(),\n  ).await;\n  renderer.set_size(window_size.width as f64, window_size.height as f64);\n  renderer.set_pixel_ratio(pixel_ratio);\n\n  let mut pools = ResourcePools::new();\n  let (scene, camera) = create_scene(\u0026window, \u0026mut pools);\n\n  event_loop.run(move |event, _, control_flow| {\n    *control_flow = ControlFlow::Wait;\n    match event {\n      Event::WindowEvent {\n        event: WindowEvent::Resized(size),\n        ..\n      } =\u003e {\n        resize(\u0026mut renderer, \u0026mut pools, \u0026camera, size.width, size.height);\n        update(\u0026mut pools, \u0026scene);\n        render(\u0026mut renderer, \u0026mut pools, \u0026scene, \u0026camera);\n      },\n      Event::RedrawRequested(_) =\u003e {\n        update(\u0026mut pools, \u0026scene);\n        render(\u0026mut renderer, \u0026mut pools, \u0026scene, \u0026camera);\n      },\n      Event::WindowEvent {\n        event: WindowEvent::CloseRequested,\n        ..\n      } =\u003e {\n        *control_flow = ControlFlow::Exit;\n      },\n      _ =\u003e {}\n    }\n  });\n}\n```\n\n## How to import\n\nThe library is released at [crates.io](https://crates.io/crates/wgpu_rust_renderer). Add the following line into Cargo.toml of your Rust project.\n\n```\n[dependencies]\nwgpu_rust_renderer = \"0.0.4\"\n```\n\nAnd add the following lines in your Rust code to import the library.\n\n```Rust\nuse wgpu_rust_renderer::{\n  geometry::{\n    attribute::Attribute,\n    geometry::Geometry,\n    index::Index,\n  },\n  material::material::Material,\n  resource::resource::{\n    ResourceId,\n    ResourcePools,\n  },\n  scene::{\n    camera::PerspectiveCamera,\n    mesh::Mesh,\n    node::Node,\n    scene::Scene,\n  },\n  web::wgpu_web_renderer::WGPUWebRenderer, // for web\n  renderer::wgpu_renderer::{\n    WGPURenderer, // for others\n    WGPURendererOptions,\n  },\n};\n```\n\n## How to build the library locally\n\n```sh\n$ git clone https://github.com/takahirox/wgpu-rust-renderer.git\n$ cd wgpu-rust-renderer\n$ cargo build\n```\n\n## How to run desktop examples locally\n\n```sh\n$ cd wgpu-rust-renderer\n$ cargo run --example example_name\n```\n\n## How to run web examples locally\n\nPrerequirements\n- Install [wasm-bindgen client](https://rustwasm.github.io/docs/wasm-bindgen/)\n- Install Rust wasm32-unknown-unknown target with `$ rustup target add wasm32-unknown-unknown`\n- Install `http-server` with `$ npm install -g http-server`, or other local servers\n\n```sh\n$ cd wgpu-rust-renderer/web\n$ bash build_examples.sh\n$ http-server . -p 8080 -c-1\n# Access http://localhost:8080/examples/index.html on your web browser\n```\n\n## How to run tests\n\nT.B.D.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakahirox%2Fwgpu-rust-renderer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftakahirox%2Fwgpu-rust-renderer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakahirox%2Fwgpu-rust-renderer/lists"}