Skip to content
Voro
  1. Geometry
  2. Render

Surface Renderer

Surface Renderer draws a Scene with the graphics card’s rasteriser instead of tracing rays. The picture has no grain, needs no accumulation and no Reconstruct, and the same input gives the same frame every time. Lights cast shadows from shadow maps. Ambient occlusion and short contact shadows darken creases. An optional procedural sky or solid colour replaces the flat ambient, and one layer of glass renders over the opaque frame.

It does not trace light between surfaces. There is no indirect bounce, no reflection of other objects and no caustics. For that, use Realtime Trace. Pick Surface Renderer for speed, for a clean base to build graphic looks on downstream, and for passes to composite with. Its misses stay transparent, and it can publish surface ids, uv, rest position and other passes the path tracers do not have.

Place Surface Renderer from the Geometry view of the Voro menu, under Render. On its Scene page, set Scene to a Scene and Scene Mode to Scene, as on the other renderers.

Set the render size in Resolution1 and Resolution2 on the Renderer page. It opens at 1920 by 1080. Surface Renderer has no Preset menu.

It publishes beauty alone at first. To add passes, open the AOVs page and add rows to Outputs. Each row picks one Pass, and each pass gets its own output connector, named after it. Choose each pass once. Changing the pass in a row that is already wired keeps the wire and sends the new pass down it. Removing a row whose output is wired is refused until you disconnect it.

scene takes the collected scene. The generated table below lists beauty only, because the other outputs come from your choice on the AOVs page:

  • beauty and coverage. Beauty’s alpha is the pixel’s coverage, so misses are transparent.
  • Lighting layers: base_color, emission, diffuse, specular, lighting and shadow. lighting is the light arriving at the surface before its colour. shadow is direct-light visibility, 1 where no direct light falls.
  • Surface guides: depth, geometric_normal, normal with roughness in its fourth channel, uv, rest and tangent.
  • Identity: object_id, material_id and surface_id. They carry exact integers and never blend at an edge.
  • History: motion, and validity, which holds each pixel’s coverage and whether its uv, its rest position and its match with last frame are valid.

Every pass is a GPU float32 image with the bottom row first. Colours are linear with straight alpha. A miss reads zero, except depth, which reads 1e30. Only the passes you select cost memory and time. Selecting only guides skips the lighting and shadow work.

The Renderer page shows the controls under their plain names, such as Cutdistance and Shadowextent.

  • Resolution1 and Resolution2 set the render size, up to 8192 on each axis.
  • Exposure multiplies the linear image. Ambient is the flat fill light used while the environment is off.
  • Shadows is 1 for on and 0 for off. Shadowsize sets the shadow map’s resolution, from 256 to 4096. Shadowextent is the size of the world the shadows cover, in world units, and it must fit the scene. Shadowbias moves the shadow test off the surface along its normal, in world units.
  • Aoradius and Aostrength set how far ambient occlusion looks and how dark it gets. Contactlength is the length of the short contact shadow traced toward each light.
  • Coveragesamples is 1 or 4. 4 smooths edges. 2 and 3 are reported as invalid. Ids stay whole at 4, one surface per pixel.
  • Pointradius and Tuberadius are the radii for points and lines that carry no radius of their own.
  • Cutdistance is how far the camera can move in one frame before Surface Renderer treats it as a cut and drops last frame’s match from motion and validity. A turn over 45 degrees, a lens change and a change of topology do the same. Reset drops it by hand.
  • A Sky selected on the Scene or the renderer supplies environment light, taking precedence over the fallback controls below. Its sun casts shadows like a distant light.
  • Envenabled 1 replaces Ambient with the fallback environment when no Sky is selected. Envmodel 0 is the procedural sky and 2 a solid colour. 1, HDR, falls back to Ambient with a warning. Use a Sky with its hdr input for HDR lighting. Envcolor, Envintensity, Sundir, Sunintensity, Skyintensity, Turbidity and Groundalbedo shape the fallback environment.
  • Aovs is the stored list the AOVs page writes. It is read only in TouchDesigner.

Surface Renderer draws a Material’s colour, metalness, roughness, specular, IOR, emission and all five image maps, as the path tracers do. It swaps in a neutral grey for an authored look, thin film, coat, fuzz and the Emissive model. It skips authored Light programs and Unified Volume volumes, and ignores per-point roughness and metallic sources. Each substitution or skip is a warning that names the Material, light or object, and everything else still draws. It only checks Materials that something visible uses.

A Voro Light preset that runs a light program is skipped too. For a light here, use a native TouchDesigner Light COMP, or clear the Light’s Source and pulse Reload.

Glass renders as one layer. Glass behind glass shows only the nearest, refraction bends only what is on screen, and every pass except beauty shows the opaque surface behind. Glass tints the shadows it casts.

With no lights and no environment, a default directional light keeps the scene visible. The environment lights surfaces but is not drawn behind them.

Lights use the same unit as in the path tracers. A light that makes a facing white surface read 1.0 there makes it read 1.0 here, though the whole picture differs because nothing bounces. The Rays page on Geometry and Place does nothing here.

With no camera selected, nothing falls back to a default. A missing camera, an invalid size or invalid scene data stops the render with an error, because no trustworthy frame can be made.

Inputs

  • scene scene required

Outputs

  • beauty image required
    RGBA

Renderer

Resolution1 (Resolution1) Int op('surface_render').par.Resolution1
Default:
1920
Range:
1 to 8192
Resolution2 (Resolution2) Int op('surface_render').par.Resolution2
Default:
1080
Range:
1 to 8192
Cutdistance (Cutdistance) Float op('surface_render').par.Cutdistance
Default:
5
Range:
0.01 to 10000
Coveragesamples (Coveragesamples) Int op('surface_render').par.Coveragesamples
Default:
1
Range:
1 to 4
Shadows (Shadows) Int op('surface_render').par.Shadows
Default:
1
Range:
0 to 1
Reset (Reset) Pulse op('surface_render').par.Reset
Default:
None
Exposure (Exposure) Float op('surface_render').par.Exposure
Default:
1
Range:
0 to 100
Ambient (Ambient) Float op('surface_render').par.Ambient
Default:
0.08
Range:
0 to 10
Shadowextent (Shadowextent) Float op('surface_render').par.Shadowextent
Default:
20
Range:
0.01 to 10000
Shadowbias (Shadowbias) Float op('surface_render').par.Shadowbias
Default:
0.001
Range:
0 to 0.1
Aoradius (Aoradius) Float op('surface_render').par.Aoradius
Default:
0.35
Range:
0 to 100
Aostrength (Aostrength) Float op('surface_render').par.Aostrength
Default:
1
Range:
0 to 2
Contactlength (Contactlength) Float op('surface_render').par.Contactlength
Default:
0.3
Range:
0 to 100
Shadowsize (Shadowsize) Int op('surface_render').par.Shadowsize
Default:
2048
Range:
256 to 4096
Pointradius (Pointradius) Float op('surface_render').par.Pointradius
Default:
0.02
Range:
0 to 100
Tuberadius (Tuberadius) Float op('surface_render').par.Tuberadius
Default:
0.01
Range:
0 to 100
Envenabled (Envenabled) Int op('surface_render').par.Envenabled
Default:
0
Range:
0 to 1
Envmodel (Envmodel) Int op('surface_render').par.Envmodel
Default:
0
Range:
0 to 2
Envcolorr (Envcolorr) Float op('surface_render').par.Envcolorr
Default:
0.5
Range:
0 to 1
Envcolorg (Envcolorg) Float op('surface_render').par.Envcolorg
Default:
0.5
Range:
0 to 1
Envcolorb (Envcolorb) Float op('surface_render').par.Envcolorb
Default:
0.5
Range:
0 to 1
Envintensity (Envintensity) Float op('surface_render').par.Envintensity
Default:
1
Range:
0 to 4
Sundirx (Sundirx) Float op('surface_render').par.Sundirx
Default:
0.2
Range:
-1 to 1
Sundiry (Sundiry) Float op('surface_render').par.Sundiry
Default:
0.5
Range:
-1 to 1
Sundirz (Sundirz) Float op('surface_render').par.Sundirz
Default:
0.4
Range:
-1 to 1
Sunintensity (Sunintensity) Float op('surface_render').par.Sunintensity
Default:
1
Range:
0 to 20
Skyintensity (Skyintensity) Float op('surface_render').par.Skyintensity
Default:
1
Range:
0 to 4
Turbidity (Turbidity) Float op('surface_render').par.Turbidity
Default:
2.5
Range:
1 to 10
Groundalbedo (Groundalbedo) Float op('surface_render').par.Groundalbedo
Default:
0.1
Range:
0 to 1

AOVs

Aovs (Aovs) Str op('surface_render').par.Aovs
Default:
["beauty"]