Skip to content

Shadows

This example demonstrates a Cornell box-style scene with multiple spheres, different materials (matte, mirror, conductor), and shadow rendering.

julia
using GeometryBasics
using Hikari
using ImageShow

# Helper to tessellate primitives
to_mesh(prim) = normal_mesh(prim isa Sphere ? Tesselation(prim, 64) : prim)

# Define materials
material_white = Hikari.MatteMaterial(Kd=Hikari.RGBSpectrum(0.9f0))
material_red = Hikari.MatteMaterial(Kd=Hikari.RGBSpectrum(0.8f0, 0.2f0, 0.2f0))
material_green = Hikari.MatteMaterial(Kd=Hikari.RGBSpectrum(0.2f0, 0.8f0, 0.2f0))
material_blue = Hikari.MatteMaterial(Kd=Hikari.RGBSpectrum(0.3f0, 0.5f0, 0.9f0))
mirror = Hikari.MirrorMaterial(Kr=Hikari.RGBSpectrum(0.95f0))

# Build scene
scene = Hikari.Scene()

# Spheres with different materials
push!(scene, to_mesh(Sphere(Point3f(0, 0.5, 0), 0.5f0)), mirror)        # Center mirror
push!(scene, to_mesh(Sphere(Point3f(0.8, 0.3, 0.3), 0.3f0)), material_blue)
push!(scene, to_mesh(Sphere(Point3f(-0.8, 0.3, 0.3), 0.3f0)), material_red)
push!(scene, to_mesh(Sphere(Point3f(0, 0.25, 0.9), 0.25f0)), material_white)

# Room geometry (Cornell box style, Y-up)
push!(scene, to_mesh(Rect3f(Vec3f(-2, 0, -2), Vec3f(4, 0.01, 4))), material_white)   # Floor
push!(scene, to_mesh(Rect3f(Vec3f(-2, 0, 2 - 0.01), Vec3f(4, 3, 0.01))), material_white)  # Back wall
push!(scene, to_mesh(Rect3f(Vec3f(-2, 0, -2), Vec3f(0.01, 3, 4))), material_red)     # Left wall
push!(scene, to_mesh(Rect3f(Vec3f(2 - 0.01, 0, -2), Vec3f(0.01, 3, 4))), material_green)  # Right wall

# Lights
push!(scene, Hikari.PointLight(Point3f(0f0, 2.5f0, 0f0), Hikari.RGBSpectrum(12f0)))
push!(scene, Hikari.PointLight(Point3f(-1f0, 1.5f0, -1.5f0), Hikari.RGBSpectrum(4f0)))

Hikari.sync!(scene)

# Camera and film
resolution = Point2f(512, 512)
film = Hikari.Film(resolution)
camera = Hikari.PerspectiveCamera(
    Point3f(0f0, 1.5f0, -3f0), Point3f(0f0, 0.4f0, 0f0), film; fov=50f0,
)
Hikari.clear!(film)

# Render
integrator = Hikari.VolPath(samples=16, max_depth=10)
integrator(scene, film, camera)

img = Hikari.postprocess!(film; exposure=1.0f0, tonemap=:aces, gamma=2.2f0)
Array(img)