Skip to content

Renderer

The Renderer is the main entry point for FragmentColor and normally the first object you create.

It is used to render Shaders, Passes, and Frames to a Target (canvas, window, or texture).

The Renderer internals are lazily initialized when the user creates a Target.

See the constructor Renderer::new() description below for details.

1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Shader, Renderer, Target};
let renderer = Renderer::new();
// Use your platform's windowing system to create a window
let window = fragmentcolor::headless_window([800, 600]);
// Create a Target from it
let target = renderer.create_target(window).await?;
let texture_target = renderer.create_texture_target([16, 16]).await?;
// RENDERING
renderer.render(&Shader::default(), &texture_target)?;
// That's it. Welcome to FragmentColor!
7 collapsed lines
let s = target.size();
assert_eq!([s.width, s.height], [800, 600]);
let s2 = texture_target.size();
assert_eq!([s2.width, s2.height], [16, 16]);
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

At the point of creation, we don’t know the Renderer will be used offscreen or attached to a Window.

So, the rendering internals are lazily initialized when the user creates a Target. This ensures the adapter and device are compatible with the environment.

The API ensures the Renderer is usable when render() is called, because the render() method expects a Target as input, and the only way to create a Target is by first calling:

  • renderer.create_target(Window) to create a window adapter, or
  • renderer.create_texture_target() to create a target texture
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Target};
let renderer = Renderer::new();
let texture_target = renderer.create_texture_target([16, 16]).await?;
5 collapsed lines
let s = texture_target.size();
assert_eq!([s.width, s.height], [16, 16]);
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Renderer::create_target(target: Canvas | Window)

Section titled “Renderer::create_target(target: Canvas | Window)”

Creates a Target attached to a platform-specific canvas or window.

1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Target};
let renderer = Renderer::new();
// Use your platform's windowing system to create a window.
// We officially support Winit. Check the examples folder for details.
let window = fragmentcolor::headless_window([800, 600]);
let target = renderer.create_target(window).await?;
5 collapsed lines
let s = target.size();
assert_eq!([s.width, s.height], [800, 600]);
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Renderer::create_texture_target(size: [u32; 2])

Section titled “Renderer::create_texture_target(size: [u32; 2])”

Render to an offscreen texture without a Window or Canvas.

This is useful for tests, server-side rendering, or running examples in CI.

1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Shader, Target};
let renderer = Renderer::new();
// Create an offscreen texture target with a size of 64x64 pixels.
let target = renderer.create_texture_target([64, 64]).await?;
renderer.render(&Shader::default(), &target)?;
// get the rendered image
let image = target.get_image();
5 collapsed lines
// RGBA8
assert_eq!(image.len(), 64 * 64 * 4);
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a Texture from various inputs.

  • Rust: create_texture(input) infers from encoded bytes or file path; use create_texture_with(input, Some(size), Some(format)) for raw pixel bytes.
  • JS: await renderer.createTexture(input) accepts Uint8Array bytes, string URL/path, or a CSS selector/HTMLImageElement
  • Python: renderer.create_texture(input) accepts bytes, str path, or a NumPy ndarray shaped [H, W, C] where C=1/3/4.
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::Renderer;
let renderer = Renderer::new();
// Load encoded image bytes (PNG/JPEG) or use a file path
let image = std::fs::read("logo.png")?;
let tex = renderer.create_texture(&image).await?;
4 collapsed lines
_ = tex.size();
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a Texture from various inputs.

  • Rust: create_texture(input) infers from encoded bytes or file path; use create_texture_with(input, Some(size), Some(format)) for raw pixel bytes.
  • JS: await renderer.createTexture(input) accepts Uint8Array bytes, string URL/path, or a CSS selector/HTMLImageElement
  • Python: renderer.create_texture(input) accepts bytes, str path, or a NumPy ndarray shaped [H, W, C] where C=1/3/4.
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Size};
let renderer = Renderer::new();
let pixels: Vec<u8> = vec![
255,0,0,255, 0,255,0,255,
0,0,255,255, 255,255,255,255,
];
let tex = renderer.create_texture_with_size(&pixels, [2, 2]).await?;
4 collapsed lines
_ = tex.size();
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a Texture from various inputs.

  • Rust: create_texture(input) infers from encoded bytes or file path; use create_texture_with(input, Some(size), Some(format)) for raw pixel bytes.
  • JS: await renderer.createTexture(input) accepts Uint8Array bytes, string URL/path, or a CSS selector/HTMLImageElement
  • Python: renderer.create_texture(input) accepts bytes, str path, or a NumPy ndarray shaped [H, W, C] where C=1/3/4.
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Size, TextureFormat};
let renderer = Renderer::new();
let image = std::fs::read("logo.png")?;
let tex = renderer.create_texture_with_format(&image, TextureFormat::Rgba).await?;
4 collapsed lines
_ = tex.size();
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a Texture from various inputs.

  • Rust: create_texture(input) infers from encoded bytes or file path; use create_texture_with(input, Some(size), Some(format)) for raw pixel bytes.
  • JS: await renderer.createTexture(input) accepts Uint8Array bytes, string URL/path, or a CSS selector/HTMLImageElement
  • Python: renderer.create_texture(input) accepts bytes, str path, or a NumPy ndarray shaped [H, W, C] where C=1/3/4.
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Size};
let renderer = Renderer::new();
let pixels: Vec<u8> = vec![
255,0,0,255, 0,255,0,255,
0,0,255,255, 255,255,255,255,
];
let tex = renderer.create_texture_with(&pixels, Size::from([2, 2])).await?;
4 collapsed lines
_ = tex.size();
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a storage-class texture for compute or image store/load.

  • Default usage: STORAGE_BINDING | TEXTURE_BINDING | COPY_{SRC,DST}
1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, TextureFormat};
let r = Renderer::new();
let tex = r.create_storage_texture([64, 64], TextureFormat::Rgba, None).await?;
4 collapsed lines
_ = tex;
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }

Create a depth texture using Depth32Float.

The created depth texture inherits the renderer’s current sample count:

  • If you called create_target(window) (surface-backed), it matches the negotiated MSAA (e.g., 2×/4×) for that surface.
  • If you are rendering offscreen via create_texture_target, it defaults to 1.

This ensures the depth attachment sample_count matches the pass sample_count. If you attach a depth texture with a different sample_count than the pass, rendering will return a descriptive validation error.

use fragmentcolor::Renderer;
let r = Renderer::new();
let depth = r.create_depth_texture([800, 600]);

Renderer::render(renderable: Shader | Pass | Frame, target: Target)

Section titled “Renderer::render(renderable: Shader | Pass | Frame, target: Target)”

Renders the given object to the given Target.

1 collapsed line
async fn run() -> Result<(), Box<dyn std::error::Error>> {
use fragmentcolor::{Renderer, Shader};
let renderer = Renderer::new();
let target = renderer.create_texture_target([10, 10]).await?;
let shader = Shader::default();
renderer.render(&shader, &target)?;
3 collapsed lines
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> { pollster::block_on(run()) }