EmbarkStudios / kajiya
- четверг, 23 декабря 2021 г. в 00:39:44
💡 Experimental real-time global illumination renderer 🦀
Its general goal is to get as close as possible to path-traced reference at real-time rates in dynamic scenes, without any precomputed light transport, or manually placed light probes.
kajiya
does not currently aim to be a fully-featured renderer used to ship games, support all sorts of scenes, lighting phenomena, or a wide range of hardware. It's a hobby project, takes a lot of shortcuts, and is perpetually a work in progress.
For more context, check out our announcement article on Embark's Medium. You'll also get to learn how kajiya
connects to our rendering work, and the rust-gpu
project!
Ruins environment rendered in kajiya. Scene by Crebotoly
assets/shaders/
crates/lib/rust-shaders/
world_render_passes.rs
restir-meets-surfel
- latest experimental branch, with new GI in the workskajiya
currently works on a limited range of operating systems and hardware.
Hardware:
Operating systems:
libtinfo5
uuid-dev
There's a very minimal asset pipeline in bake.rs
, which converts meshes from GLTF to an internal flat format, and calculates texture mips. In order to bake all the provided meshes, run:
bake.cmd
./bake.sh
When done, run the renderer demo (view
app from crates/bin/view
) via:
build_and_run.cmd [scene_name]
./build_and_run.sh [scene_name]
Where [scene_name]
is one of the file names in assets/scenes
, without the .ron
extension, e.g.:
build_and_run.cmd battle
or
cargo run --bin view --release -- --scene battle --width 1920 --height 1080 --no-debug
view
appFor the view
app, DPI scaling in the operating system affects the physical number of pixels of the rendering output. The --width
and --height
parameters correspond to logical window size and the internal rendering resolution. Suppose the OS uses DPI scaling of 1.5
, and the app is launched with --width 1000
, the actual physical width of the window will be 1500
px. Rendering will still happen at 1000
px, with upscaling to 1500
px at the very end, via a Catmull-Rom kernel.
kajiya
can also render at a reduced internal resolution, and reconstruct a larger image via temporal upsampling, trading quality for performance. A custom temporal super-resolution algorithm is used by default, and DLSS is supported on some platforms. Both approaches result in better quality than what could be achieved by simply spatially scaling up the image at the end.
For example, --width 1920 --height 1080 --temporal-upsampling 1.5
will produce a 1920x1080
image by upsampling by a factor of 1.5
from 1280x720
. Most of the rendering will then happen with 1.5 * 1.5 = 2.25
times fewer pixels, resulting in an almost 2x speedup.
To add new mesh(es), open bake.cmd
(Win) / bake.sh
(Linux), and add
To add new scenes, in \assets\scenes
, create a [scene_name].ron
with the following content:
(
instances: [
(
position: (0, 0, 0),
mesh: "[mesh_name]",
),
]
)
--gi-volume-scale
to change its extent in the view
appCASCADE_COUNT
and SCROLL_CASCADES
in csgi.rs
)This project is made possible by the awesome open source Rust community, and benefits from a multitude of crates
Special shout-outs go to:
kajiya
.kajiya
to talk to the GPU.We welcome community contributions to this project.
Please read our Contributor Guide for more information on how to get started. Please also read our Contributor Terms before you make any contributions.
Any contribution intentionally submitted for inclusion in an Embark Studios project, shall comply with the Rust standard licensing model (MIT OR Apache 2.0) and therefore be dual licensed as described below, without any additional terms or conditions:
This contribution is dual licensed under EITHER OF
at your option.
For clarity, "your" refers to Embark or any other licensee/user of the contribution.