All Projects → amethyst → Rendy

amethyst / Rendy

Licence: other
State of the art "build your own engine" kit powered by gfx-hal

Programming Languages

rust
11053 projects

Projects that are alternatives of or similar to Rendy

Flycube
Graphics API wrapper is written in C++ on top of Directx 12 and Vulkan. Provides main features including ray tracing.
Stars: ✭ 78 (-89.6%)
Mutual labels:  gamedev, graphics, vulkan, renderer
Bgfx
Cross-platform, graphics API agnostic, "Bring Your Own Engine/Framework" style rendering library.
Stars: ✭ 10,252 (+1266.93%)
Mutual labels:  gamedev, graphics, vulkan
Bansheeengine
Modern C++14 game engine with Vulkan support, fully featured editor and C# scripting
Stars: ✭ 2,906 (+287.47%)
Mutual labels:  gamedev, graphics, vulkan
3d Game Shaders For Beginners
🎮 A step-by-step guide to implementing SSAO, depth of field, lighting, normal mapping, and more for your 3D game.
Stars: ✭ 11,698 (+1459.73%)
Mutual labels:  gamedev, graphics, vulkan
Bsf
Modern C++14 library for the development of real-time graphical applications
Stars: ✭ 1,640 (+118.67%)
Mutual labels:  gamedev, graphics, vulkan
Diligentengine
A modern cross-platform low-level graphics library and rendering framework
Stars: ✭ 2,142 (+185.6%)
Mutual labels:  gamedev, vulkan, renderer
Diligentsamples
Sample projects demonstrating the usage of Diligent Engine
Stars: ✭ 138 (-81.6%)
Mutual labels:  gamedev, vulkan, renderer
Alimer
Cross-platform game engine.
Stars: ✭ 172 (-77.07%)
Mutual labels:  gamedev, graphics, vulkan
Magnum
Lightweight and modular C++11 graphics middleware for games and data visualization
Stars: ✭ 3,728 (+397.07%)
Mutual labels:  gamedev, graphics, vulkan
Radialprogressbar
Customizable radial progress bar shader for Unity3D. Allows you to set arc range, minimum and maximum colors, textures, radius, and a few more things. Create HP Bars, Speedometers, rank progress, etc!
Stars: ✭ 714 (-4.8%)
Mutual labels:  gamedev, graphics
Cpp 3d Game Tutorial Series
C++ 3D Game Tutorial Series is a YouTube tutorial series, whose purpose is to help all those who want to take their first steps in the game development from scratch.
Stars: ✭ 400 (-46.67%)
Mutual labels:  gamedev, graphics
Vulkan best practice for mobile developers
Vulkan best practice for mobile developers
Stars: ✭ 424 (-43.47%)
Mutual labels:  graphics, vulkan
Holoshield
Highly customizable sci-fi shield / force field shader for Unity3D. Allows you to set edge power & color, inner texture scrolling, waviness, scale pulsation and procedural intensity noise. Implements tessellation for low-poly base meshes.
Stars: ✭ 401 (-46.53%)
Mutual labels:  gamedev, graphics
Shadergen
Proof-of-concept library for generating HLSL, GLSL, and Metal shader code from C#,
Stars: ✭ 395 (-47.33%)
Mutual labels:  graphics, vulkan
Ash
Vulkan bindings for Rust
Stars: ✭ 676 (-9.87%)
Mutual labels:  gamedev, vulkan
Libsdl2pp
C++11 bindings/wrapper for SDL2
Stars: ✭ 385 (-48.67%)
Mutual labels:  gamedev, graphics
Verticaldissolve
Procedural vertical dissolve shader. Highly customizable. Tweak edge color, noisiness & waviness, rim light, emission scrolling and more.
Stars: ✭ 434 (-42.13%)
Mutual labels:  gamedev, graphics
Gfx
[maintenance mode] A low-overhead Vulkan-like GPU API for Rust.
Stars: ✭ 5,045 (+572.67%)
Mutual labels:  graphics, vulkan
Beam
✨ Expressive WebGL
Stars: ✭ 383 (-48.93%)
Mutual labels:  graphics, renderer
Vortice.windows
.NET standard bindings for DirectX, WIC, Direct2D1, XInput, XAudio and X3DAudio
Stars: ✭ 427 (-43.07%)
Mutual labels:  gamedev, graphics

Build Status Crates.io docs page MIT/Apache Lines of Code

A rendering engine based on gfx-hal, which mimics the Vulkan API.

Building

This library requires standard build tools for the target platforms, except in the case of windows - the spirv-compiler feature requires Ninja to be installed for compilation. https://ninja-build.org

Features

Most importantly rendy features safer API by checking important states and invariants. It checks invariants statically using marker types and dynamically with stored values.

Capability

Queue family capability defines what operation queues of the family supports. rendy provides simple mechanisms to prevent recording unsupported commands. A queue's capability level can be stored statically by marking the Family type with one of capability types: Transfer, Graphics, Compute or General (Graphics and Compute combined). Alternatively the Capability type can be used instead of the marker type, this way actual capability level can be checked dynamically.

Command buffer

rendy provides a handy wrapper named CommandBuffer. In contrast to its raw counterpart this wrapper encodes crucial information about its state directly into the type. This means users can't accidentally:

  • record commands unsupported by queue family it belongs to.
  • record commands when a command buffer is not in recording state.
  • record render pass commands outside renderpass.
  • forget to finish recording a buffer before submitting.
  • resubmit a command buffer which was created for one time use.
  • record execution of a primary buffer into a secondary buffer.
  • etc

Memory manager

rendy's memory manager is called Heaps. Heaps provides convenient methods to sub-allocate device-visible memory based on usage and visibility requirements. It also handles mapping for specific usage types. It is possible for gfx-hal to adopt VMA. In which case rendy will use it

Rendergraph

rendy's rendergraph allows writing rendering code in simple modular style. Note that this is not a scene graph offered by high-level graphics libraries, where nodes in the graph correspond to complex objects in the world. Instead it is a graph of render passes with different properties. This makes it much easier to compose a complex frame from simple parts. A user defines nodes which declare which buffers and images it reads and writes and the rendergraph takes responsibility for transient resource allocation and execution synchronization. The user is responsible only for intra-node synchronization.

DynNode implementation - RenderPassNode can be constructed from RenderGroups collected into subpasses. RenderPassNode will do all work for render pass creating and inter-subpass synchronization. There will be more Node, DynNode and RenderGroup implementations to further simplify usage and reduce boilerplate code required for various use cases.

Cirques

This hybrid of circus and queue simplifies synchronizing host access to resources. Cirque allocates copies of the resource from resource specific allocator (e.g. CommandPool for CommandBuffers, Factory for Buffers) and gives access to the unused copy.

CPU-GPU data flow

Rendy can help to send data between device and host. The Factory type can upload data to the device local memory choosing most appropriate technique for that.

  • Memory mapping will be used if device local memory happens to be cpu-visible.
  • Relatively small data will be uploaded directly to buffers.
  • Staging buffer will be used for bigger uploads or any image uploads. Factory will automatically insert synchronization commands according to user request.

GPU-CPU data flow - Not yet implemented

Data driven pipelines - WIP

We think it is possible in many common cases to feed GPU with data in semi-automatic mode. rendy::graph::node::render::RenderGroup implementation will use spirv-reflect (or similar crate) to read layout information directly from shaders and use it to automatically populate descriptors and set index/vertex buffers based on registered data encoders and provided scene instance. Current WIP implementation will use specs::World as scene to render.

Declarative pipelines - Planned

Pipelines and descriptor sets has declarative nature and it is much easier to define them declaratively. rendy provides a trait for this called DescriptorSet. Deriving it will automatically generate code necessary for set creation, writing and binding. Deriving the GraphicsPipeline trait will generate code for graphics pipeline creation and usage. A similar ComputePipeline trait exists for compute pipelines.

Example

#[derive(DescriptorSet)]
struct Example {
    /// This field will be associated with binding 1 of type `VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER`.
    /// Actual `Buffer` will be allocated and kept updated by `Set<Example>`.
    #[descriptor(UniformBlock)]
    transform: mat4,

    /// This field will be associated with binding 2 of type `VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE`.
    /// `ImageView` will be fetched from `Texture` which implements `Borrow<ImageView>`.
    #[descriptor(SampledImage)]
    texture: Texture,

    /// Raw `gfx-hal` objects can be used as well.
    /// But this field will make binding `Set<Example>` to a command buffer an unsafe operation
    /// since it is the user's job to ensure that this raw image view is valid during command buffer execution.
    #[descriptor(unsafe, SampledImage)]
    foo: RawImageView,
}

Modularity

Most of the features provided by rendy can be used independently from each other This helps to keep API clean and hopefully sound. The top-level umbrella crate rendy has features for each subcrate so that they could be enabled separately (enabling a subcrate will also enable its dependencies).

Changelog

Who is using it?

Kindly open a PR or issue if you're aware of other projects using rendy.

License

Licensed under either of

at your option.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].