Easy to use, customizable, efficient 3D renderer library built on wgpu.
Library is under active development. While internals are might change in the future, the external api remains stable, with only minor changes occuring as features are added.
Take a look at the examples for getting started with the api. The examples will show how the core library and helper crates can be used.
These screenshots are from the scene-viewer example.
rend3 ecosystem is composed of a couple core crates which provide most
of the functionality and exensibility to the library, extension crates, and
rend3: The core crate. Performs all handling of world data, provides the Renderer and RenderGraph and defines vocabulary types.
rend3-routine: Implementation of various “Render Routines” on top of the RenderGraph. Also provides for re-usable graphics work. Provides PBR rendering, Skyboxes, Shadow Rendering, and Tonemapping.
There are extension crates that are not required, but provide pre-made bits of useful code that I would recommend using.
rend3-framework: Vastly simplifies correct handling of the window and surface across platforms.
rend3-gltf: Modular gltf file and scene loader.
Integration with other external libraries are also offered. Due to external dependencies, the versions of these may increase at a much higher rate than the rest of the ecosystem.
rend3-egui: Integration with the egui immediate mode gui.
rend3-imgui: Integration with the imgui immediate mode gui.
rend3 supports two different rendering profiles one for speed and one for compatibility.
The modern profile not only offloads a lot more work to the gpu, it can do more aggressive performance optimizations including only drawing exactly the triangles that are needed
|Profile||Texture Access||Object Culling||Triangle Culling||Draw Calls|
|GpuDriven||Bindless||On GPU||On GPU||Merged Indirect|
|CpuDriven||Bound||On CPU||❌||Instanced Direct|
The following table shows support of various profiles on various apis/platforms. This will hopefully help you judge what your target demographic supports.
|Windows 7+||Vulkan||AMD / NVIDIA||✅||—|
|Windows 10+||Dx12||Intel 6XXX+ / AMD GCN 2+ / NVIDIA 6XX+||🚧||✅|
|MacOS 10.13+ iOS 11+||Metal||Intel / Apple A13+ / M1+||✅||—|
|Linux||Vulkan||Intel 6XXX+ / AMD GCN 2+ / NVIDIA 6XX+||✅||—|
- ✅ Supported
- 🚧 In Progress
- ❌ Unsupported
- — Modern Profile Used
- Intel 6XXX = Skylake
- Intel 4XXX = Haswell
- Intel 2XXX = Sandy Bridge
- AMD GCN 2 = Rx 200+, RX 5000+
- Apple A9 = iPhone 6S, iPad 5th Gen
- Apple A13 = iPhone 11, iPad 9th Gen
rend3 tries to fulfill the following usecases:
- Games and visualizations that need a customizable, and efficient renderer.
- Projects that just want to put objects on screen, but want lighting and effects.
- A small cog in a big machine: a renderer that doesn’t interfere with the rest of the program.
rend3 is not:
- A framework or engine. It does not include all the parts needed to make an
advanced game or simulation nor care how you structure your program.
If you want a very basic framework to deal with windowing and event loop management,
rend3-frameworkcan help you. This will always be optional and is just there to help with the limited set of cases it canhelp
I have grand plans for this library. An overview can be found in the issue tracker under the enhancement label.
We have a matrix chatroom that you can come and join if you want to chat about using rend3 or developing it:
If discord is more your style, our meta project has a channel which mirrors the matrix rooms:
We welcome all contributions and ideas. If you want to participate or have ideas for this library, we’d love to hear them!
Rendergraph implementation that rend3 uses for all render work scheduling.
Managers for various type of resources.
Utilities and isolated bits of functionality that need a home.
Information about an adapter. Includes named PCI IDs for vendors.
Container for Instance/Adapter/Device/Queue etc.
Validated set of features and limits for a given T.
Core struct which contains the renderer world. Primary way to interact with the world.
All the mutex protected data within the renderer
Enum mapping to each of a device’s limit.
Stores two different types of data depending on the renderer mode.
Reason why the renderer failed to initialize.
Determines if the renderer is using cpu-driven rendering, or faster gpu-driven rendering.
Set of common GPU vendors.
Features required to run in the GpuDriven profile.
Limits required to run in the CpuDriven profile.
Features required to run in the GpuDriven profile.
Limits required to run in the GpuDriven profile.
Format of all shadow maps.
Largest uniform buffer binding needed to run rend3.
Features that rend3 can use if it they are available, but we don’t require.
Resolution of all shadow maps.
Check that all required features for a given profile are present in the feature set given.
Check that all required limits for a given profile are present in the given limit set.
Convinence function that re-configures the surface with the expected usages.
Creates an Instance/Adapter/Device/Queue using the given choices. Tries to get the best combination.