Four Solaris (LOP) nodes for rendering with Arnold in Houdini. They came out of a feature-animation lighting pipeline, where they handled the boring half of lighting setup — writing AOVs into USD, naming output files, and wiring a light blocker to a piece of control geometry. They have been stripped of everything studio-specific so they work on their own.
| Node | Type name | What it does |
|---|---|---|
| Arnold Render Setup | solarnold::arnold_render_setup::1.0 |
Turns a list of AOV names into RenderVar prims, groups them into RenderProduct prims, names the output files, links it all to the RenderSettings |
| Arnold Custom AOV | solarnold::arnold_custom_aov::1.0 |
A material library preloaded with an Arnold AOV shader chain (AO, UV, rim, cryptomatte) ready to extend |
| Light Blocker Transform | solarnold::light_blocker_transform::1.0 |
Drives the matrix of an Arnold light_blocker from the world transform of any prim, so you can place a blocker with ordinary geometry |
| Arnold Ass Procedural | solarnold::arnold_ass_procedural::1.0 |
Points an ArnoldProcedural prim at a .ass file and reads its .asstoc for bounds |
Full parameter reference for each one is in docs/.
- Houdini 19.5 or newer. The HDAs are saved from 21.0 and verified to load in 19.5, 20.0, 20.5 and 21.0.
- HtoA.
Arnold Render Setup reads its AOV table from
htoa.lop, and the other three author Arnold prim types. Without HtoA installed the nodes will load but do nothing useful.
Light Blocker Transform is the one node with no HtoA Python dependency — it only
needs the arnold:light_blocker shader to exist on the stage.
Clone the repository into your Houdini packages directory and put the package file one level up:
cd $HOUDINI_USER_PREF_DIR/packages # e.g. ~/houdini21.0/packages
git clone https://github.com/WangSnowchen/solarnold.git
cp solarnold/packages/solarnold.json .Restart Houdini. The nodes appear in the LOP tab menu under Solarnold.
If you keep the repository somewhere else, copy packages/solarnold.json into
your packages directory and point SOLARNOLD at wherever you cloned it:
{
"enable": true,
"env": [
{ "SOLARNOLD": "/where/you/cloned/solarnold" }
],
"path": "$SOLARNOLD"
}Or skip packages entirely and load otls/*.hda by hand from
Assets ▸ Install Digital Asset Library.
Both are optional. Everything works without them.
| Variable | Default | Meaning |
|---|---|---|
SOLARNOLD_RENDER_ROOT |
unset | Where published renders go. Arnold Render Setup prefixes output paths with it when Render Directory is set to Publish Root. If it is unset, output falls back to $HIP/render. |
SOLARNOLD_RENDER_DIR_MARKER |
images |
The publish root is trimmed back to this directory name when it appears in the path, so a deep per-shot path collapses to its images root. Set it to your own convention, or to something that never matches to disable the trimming. |
your scene
│
┌────┴─────────────┐
│ Arnold Custom AOV│ (optional — adds AO / UV / rim shader AOVs)
└────┬─────────────┘
│
┌────┴──────────────┐
│ Arnold Render │ ← needs a RenderSettings prim and a RenderPass
│ Setup │ prim upstream (or use the legacy pass name)
└────┬──────────────┘
│
USD Render ROP / husk
Add AOV names in the AOVs multiparm, tick Light Group on the ones you want split per light, set the version, and the node writes the render vars, products and file paths for you. Turn on Enable Custom AOV and it also picks up any shader-authored AOV names it finds on the stage, which is what the Arnold Custom AOV node is for.
src/ holds the expanded, diffable form of every asset — that is what to edit
and what to review in a pull request. otls/ holds the built HDAs, which are
committed so the repository is usable without Houdini's command line tools.
HFS=/opt/hfs21.0 ./scripts/build.sh # src/ -> otls/
HFS=/opt/hfs21.0 $HFS/bin/hython scripts/verify.py
HFS=/opt/hfs21.0 python3 scripts/scan.pybuild.shcollapses eachsrc/<node>/intootls/<node>.hdawithhotl.verify.pyinstalls every built HDA, creates each node, and checks type names, labels, icons, parameters, subnet contents and that all embedded Python compiles.scan.pyfails if any internal identifier, address or non-English string survives, in the sources or inside the packed HDAs.
There is also an end-to-end test that needs HtoA on HOUDINI_PATH. It builds a
small stage, runs the nodes, and checks what they authored into USD:
HOUDINI_PATH="/path/to/htoa:&" $HFS/bin/hython scripts/functional_test.pyIf you edit an asset from inside Houdini instead, save it to otls/ and then
re-expand it so the diff shows up:
$HFS/bin/hotl -t src/<node> otls/<node>.hdaMIT. See LICENSE.