Skip to content

Moonray macOS: update build compatibility for Houdini 21.0.680#228

Open
rolledhand wants to merge 35 commits into
OpenMoonRay:mainfrom
rolledhand:Moonray-Houdini21-macOS
Open

Moonray macOS: update build compatibility for Houdini 21.0.680#228
rolledhand wants to merge 35 commits into
OpenMoonRay:mainfrom
rolledhand:Moonray-Houdini21-macOS

Conversation

@rolledhand

Copy link
Copy Markdown

Compatibility:

build (Houdini 21.0.680, macOS Tahoe, Xcode 26.0.1)

Issues/Tickets:

Release notes comment:

Adds macOS compatibility updates required to build OpenMoonRay against Houdini 21.0.680 using Houdini-provided USD/PXR and Python 3.11, including Boost 1.82 alignment and Houdini USD library naming compatibility updates.

Comments for the reviewer:

Look or scene setup change:

No intended look change; this PR is compatibility, pathing, and build integration focused.

Special notes for production:

  • Tested target in this branch: Houdini 21.0.680 on macOS Tahoe with Xcode 26.0.1.
  • Production Houdini 21.0.679 has not been validated in this branch.
  • SideFX Xcode compilation note was used only as sanity context; direct relevance to OpenMoonRay-specific build/runtime behavior remains uncertain.
  • SideFX sanity reference:
  • Separate Houdini shader/HDA UX issues are not addressed by this PR.

Attention/Reviewers:

dreamworksanimation/openmoonray-maintainers

Checklist:

  • Documentation has been updated.
  • Includes new unit tests.
  • Includes new RATS tests.

@rolledhand

Copy link
Copy Markdown
Author

Tested on production build of Houdini 21.0.671, works there as well.

@randypacker

Copy link
Copy Markdown
Contributor

Thanks for the update and PR contribution! We'll take a look at it soon. In the meantime, could you please send over a CLA to moonray@dreamworks.com, so that's cleared?

@rolledhand

Copy link
Copy Markdown
Author

Hi @randypacker - just sent the CLA. Also tried to update to the latest release. I'd like to help even more and get things working, but this is as far as I'm currently capable of taking it. Hope that some of it helps at least slightly, even as an initial kick-off.

As a quick summary of what works and what doesn't. It builds and renders, lights work but when it comes to the native DWA materials they still don't take any effect at all, although the mtlx standard surface seems to be working for some material traits.

Dome light doesn't work when I tried to add one myself (worked on one of the "Solaris" demos), same case for motion blur from one of the demos, tweaking light parameters e.g. spread doesn't automatically update the IPR - normalize has an unpleasing effect, render settings started working with the latest release. I'm attaching my testing images.

H21 seems to require libpxr_usdRiPxrImaging.dylib instead of libpxr_usdRiImaging.dylib. Docs:
https://www.sidefx.com/docs/hdk/pxr_2usd_imaging_2usd_ri_pxr_imaging_2tokens_8h.html

There have been some issues with https://github.com/log4cplus/log4cplus when I was trying to install/build, hence the change there.

Additionally what I was attempting as a bit of a workaround was getting "DWA materials linked to mtlx native ones" as a bit of a workaround on the older release. Managed to get basic mtlx image working without tiling, but it goes way too deep for me at my current stage. I've got that one in another fork which was "forcing it" through Materials.cc in hydraMoonray.

Screenshot 2026-04-29 at 2 14 41 Screenshot 2026-04-29 at 2 12 16 Screenshot 2026-04-29 at 1 59 52 Screenshot 2026-04-29 at 1 50 29 Screenshot 2026-04-29 at 2 24 56 Screenshot 2026-04-29 at 1 59 52 Screenshot 2026-04-29 at 18 07 00 Screenshot 2026-04-29 at 18 07 04 Screenshot 2026-04-29 at 2 24 56 Screenshot 2026-04-29 at 1 49 01 Screenshot 2026-04-29 at 1 49 59 Screenshot 2026-04-29 at 18 22 35

@rolledhand

Copy link
Copy Markdown
Author

Sorry for the duplicate images of cornell box and the "motion blur/noise sampler" demos.

@kubo-von

kubo-von commented Apr 29, 2026

Copy link
Copy Markdown

The DomeLight not working will be probably caused by the fact that since some USD version, dome lights have DomeLight_1 as a type.

@matthewlow-dwa

Copy link
Copy Markdown
Contributor

/dco

@linux-foundation-easycla

linux-foundation-easycla Bot commented May 11, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Adds remaining parent-repo build/setup compatibility changes for Houdini 21 macOS.

Aligns Houdini mode preset/build config with Python 3.11 and Boost Python 3.11.

Includes dependency/build reproducibility updates where staged.

Includes Houdini USD/PXR compatibility mapping if staged.

Does not claim native DWA material workflow is fixed.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand rolledhand force-pushed the Moonray-Houdini21-macOS branch from aa7a352 to 9ee53f2 Compare May 11, 2026 15:42
@rolledhand

Copy link
Copy Markdown
Author

Everything signed off now @matthewlow-dwa , I've already sent some signed CLA on mail, but signed some "EasyCLA" in here as well.

@matthewlow-dwa

Copy link
Copy Markdown
Contributor

Thanks @rolledhand ! We are in the middle of transferring to a new CLA management system, so thanks for re-signing in EasyCLA, as we are unable to transfer prior signatures sent via email. EasyCLA will be the system to use going forward.

@rolledhand

Copy link
Copy Markdown
Author

You're welcome, hope this PR helps at least slightly, even as a kick-off version. I'm calling it a "Houdini launches with it and you can render state" with a couple of things which I mentioned earlier which aren't working.

Additionally here's one more of my attempts to get mtlx working - the tiling still didn't work (besides the commit name as I had it on Karma IPR by a mistake):
OpenMoonRay/hdMoonray@2a52294

But it was rather in general a bit "hacky" workaround by translating the native mtlx nodes into the native Moonray ones, not a true mtlx implementation, but I managed to get a non-tiled albedo to work. Not sure if it might help you in any way.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand rolledhand force-pushed the Moonray-Houdini21-macOS branch from 6ebf881 to aefd23b Compare May 31, 2026 18:21
@rolledhand

Copy link
Copy Markdown
Author

A quick and short summary, still in build/test mode, especially hdMoonRay is not the cleanest yet. I am trying to establish a working base first. Most of the visible Houdini/Solaris UI changes with screenshots are in moonray_dcc_plugins.

So far:

  • exposed native MoonRay nodes in USD MaterialX subnet contexts. This can be deleted in the future, but it is useful for now.
  • fixed iridescence_interpolations token -> IntVector conversion, which kept popping up in terminal.
  • made DomeLight work and exposed MoonRay parameters in the tab.
  • created a dedicated moonraymaterialbuilder subnetwork in Material Library.
  • added the DWA/MoonRay icon to the builder. This can be changed later if you have any dedicated ones.
  • cleaned the default material node layout so it is non-overlapping, can be tweaked later.
  • confirmed the material builder authors proper MoonRay surface/displacement outputs and renders.

Built for Houdini 20.5 / Python 3.11 so far. I plan to bump to Houdini 21 after making the H20.5 path stable first.

Next steps before the H21 bump:

  • expose MoonRay render geometry settings, especially subdivision/adaptive tessellation parameters.
  • get SpotLight working and aligned with the Solaris authoring approach.
  • get AOVs working and establish an artist-friendly node for them.
  • try to create a dedicated MoonRay ROP node similar to Karma/Arnold/RenderMan and align output aspects like resolution along with it.
  • get light filters working.
    -update OCIO version and make sure that the husk config gets read, faced an IPR/exr comp mismatch when I was trying to render but I had tweaked 2.0 config, will have to dive a bit deeper

During this build I had some issues around the light filter / mesh light adapter path. The problematic parts were mainly MoonrayLightFilterAdapter and MoonrayMeshLightAdapter. They pulled in Houdini USD imaging headers and hit the same Houdini 20.5 USD 24 + Xcode 26 SdfChildrenProxy compile issue, so they currently go through the local compatibility workaround.

So I would treat light filters and mesh lights as a later dedicated pass:
visible Houdini UI -> valid USD light filter prims/relationships -> hdMoonRay adapter consumes them -> MoonRay LightFilter objects are created -> lights attach them correctly -> RDL/render proves it.

@rolledhand

rolledhand commented May 31, 2026

Copy link
Copy Markdown
Author

Mesh Tesellation with subdivision controls exposed which include smooth normals as well and working along with the Motion Blur tab.

Render Geo Settings node UI:
Screenshot 2026-05-31 at 22 02 38
Screenshot 2026-05-31 at 22 02 46
Screenshot 2026-06-02 at 19 50 10

Results:
Screenshot 2026-05-31 at 21 58 21
Screenshot 2026-05-31 at 21 58 33
Screenshot 2026-05-31 at 21 58 50
Screenshot 2026-05-31 at 21 59 09
Screenshot 2026-05-31 at 21 59 26
Screenshot 2026-05-31 at 22 00 03
Screenshot 2026-05-31 at 22 00 03
Screenshot 2026-05-31 at 22 07 31

Current issues:

terminal error like this:

__SceneVariables__.target_adaptive_error: cannot convert long long to Float

__SceneVariables__.sample_clamping_value: cannot convert long long to Float

Will be fixing that in the next push.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Updates the hdMoonray submodule with lifecycle hardening for native MoonRay light filters in Houdini/Solaris.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

A small note before the next commit and push, the light filter life cycle should now be fixed. I'll have to do a proper testing on all of them. Eventually when it comes to Solaris and light filters you can you the native subnetwork assign to light (more than one) to achieve CombineLightFilter so to say.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

H20.5/macOS runtime and Beauty output validation pass

I pushed a follow-up cleanup and validation pass for the H20.5/macOS MoonRay runtime path, the default Beauty output path, and the custom MoonRay Render Settings LOP disk-output contract.

This pass keeps the scope intentionally narrow: Beauty/default output is validated, while non-beauty AOV transport remains deferred.

What changed

  1. macOS runtime startup

    • Added install-time ad-hoc signing so execComp no longer gets killed by macOS policy during production Arras startup.
    • Updated setup paths so Houdini can find the installed MoonRay Python stubs.
    • Pinned the setup default to the H20.5.584 proof target.
  2. Default Beauty output path

    • Fixed the Hydra color / final-color path so it resolves through MoonRay beauty before sourceName / sourceType handling.
    • This restores the direct/default Beauty path and keeps it separate from RenderOutput-backed AOVs.
  3. Render Settings / disk output

    • Removed the incomplete RenderSettingsPrim bridge from this pass.
    • Kept aovsupport=false, since Beauty RenderProduct/RenderVar disk output works without advertising unsupported full AOV support.
    • Updated the custom MoonRay Render Settings LOP so disk output authors a Beauty RenderVar / orderedVars by default.
  4. Viewport UI cleanup

    • Reverted the adaptive sampling viewport DS regression back to the previous working condition.
    • Synced the installed DS payloads so Houdini loads the corrected definitions.

Validation

Validated from a fresh H20.5.584 shell with production HdMoonrayRendererPlugin:

  • Direct/default color render: filled, nonconstant EXR.
  • Custom MoonRay Render Settings LOP default: filled, nonconstant EXR.
  • Generic Render Settings + built-in RenderProduct/RenderVar: filled, nonconstant EXR.
  • DCC validation: 51 PASS, 0 FAIL, 6 SKIP.

Deferred / still open

Non-beauty AOVs are still intentionally deferred. They are mapped and declared, and the debug renderer can produce data, but production Arras currently zero-fills those RenderOutput payloads.

cameraDepth is kept only as historical diagnostic evidence, not as the next implementation path.

One runtime issue is still noted separately: Arras logs SocketPeer::receive: Bad file descriptor after successful output writes. I’m not suppressing that without a proper teardown.

Pin hdMoonray to c7bbd30109884fcaf4c2536c1849dd54208cb0c1, which adds OpenColorIO-backed renderer working-space conversion for authored typed colors.

No DCC Render Settings LOP/ROP output-path changes are included. No AOV transport changes are included. No Arras runtime/signing changes are included beyond the validated hdMoonray submodule pin.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

hdMoonRay color-management checkpoint

I pushed the first real hdMoonRay renderer working-space path for Houdini 20.5.584.

This makes RenderSettings.renderingColorSpace affect actual MoonRay/RDL scene values for authored color constants, instead of only changing husk’s downstream image-save transform.

The implementation adds a direct OpenColorIO-backed conversion layer in hydramoonray, consumes renderingColorSpace through RenderDelegate::SetRenderSetting(), and converts typed USD/Hydra color values before assignment into MoonRay objects.

What changed

  1. Renderer working-space conversion

    • Added ColorManagement.h / ColorManagement.cc.
    • Linked hydramoonray against OpenColorIO::OpenColorIO.
    • Consumed RenderSettings.renderingColorSpace through RenderDelegate::SetRenderSetting().
    • Used TfToken("renderingColorSpace") for H20.5.584 compatibility.
  2. Authored color constants

    • Converted material authored color constants and typed RDL color attributes.
    • Converted light authored color values.
    • Converted light-filter authored color values.
    • Routed generic typed RDL color conversion through the same path.
  3. Render-settings lifecycle fix

    • Guarded RenderDelegate::setDisableLighting() before dirtying lights when mRenderIndex is not available.
    • This prevents a MarkSprimDirty() crash seen during TX validation when disableLighting=true.

Core proof

Case RDLA value
None / Rec.709 Rgb(0.5, 0.25, 0.125)
ACEScg Rgb(0.39735195, 0.265866846, 0.146427065)
Rec.2020 Rgb(0.401436865, 0.265854001, 0.142148465)

renderingColorSpace now changes actual MoonRay/RDLA scene values. It is no longer only husk’s downstream save transform changing the final image.

Validation

Validated against Houdini 20.5.584:

  • Rebuilt and installed hydramoonray and hd_moonray Release.
  • Installed dylibs link libOpenColorIO.2.0.dylib.
  • Installed dylibs are ad-hoc signed.
  • husk --list-renderers lists both MoonRay delegates.
  • DCC validation remains green: SUMMARY PASS=51 FAIL=0 SKIP=6.
  • Default/no-RenderProduct smoke render exits 0 and writes a valid EXR.
  • git diff --check passed in parent, hdMoonray, and DCC.

Deferred / still open

This pass intentionally does not claim full material color management in the broad sense.

  • Texture destination gamut conversion into ACEScg/Rec.2020 is not solved.
  • UsdUVTexture.sourceColorSpace=auto/sRGB/raw still survives into MoonRay and TX tests render, but that is source decode, not destination working-space conversion.
  • MaterialX image color management remains unproven.
  • Viewport/IPR visual parity still needs fresh GUI validation.
  • AOV transport was not touched.

@rolledhand

rolledhand commented Jun 14, 2026

Copy link
Copy Markdown
Author

Still need to do actual testing on this part, since I'm suspicious about a beauty pass encoded with "raw" value, but we will see. I'm stabilizing the USD Render ROP next which used to be that way before too.

Also as an insight - this doesn't mean that AOVs are stable, but "aovsupport" : true, must be set to true for the USD Render ROP to see Moonray a render delegate in the dropdown. It doesn't show up at all otherwise.

Pins moonray_dcc_plugins to the MoonRay USD Render ROP output-path wiring fix.

No backend, OCIO, Arras, AOV transport, or renderer metadata changes included.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

DCC/USD Render ROP output-path fix

I pushed a DCC-only fix for the generated MoonRay USD Render ROP output-path contract.

The previous MoonRay ROP helper deliberately left outputimage blank, so husk fell back to RenderProduct.productName = "$HIP/render/$HIPNAME.$OS.$F4.exr". When consumed outside the correct Houdini ROP/node context, that resolved to:

./render/untitled..0001.exr

That made successful renders hard to find and did not match native USD Render ROP behavior.

What changed

  1. Owned USD Render ROP output authority

    • The generated MoonRay-owned usdrender_rop now drives output through outputimage.
    • outputimage references the owning MoonRay Render Settings LOP product_name.
    • RenderProduct.productName remains valid as the USD fallback path.
  2. ROP wiring cleanup

    • loppath now uses the native-style input expression:
      • opinput(".", 0)
    • rendersettings references the owning MoonRay Render Settings LOP render settings prim.
    • Added relative sibling-path normalization so ownership/repair still works when opinput(".", 0) evaluates to a relative path like moonrayrendersettings1.
  3. Validation coverage

    • Added tests for ROP expressions, outputimage following product_name, rename/repair/recreate behavior, disconnect handling, and duplicate prevention.
    • Updated the audit doc to remove stale “outputimage blank” wording and document the repaired output-authority split.
    • Regenerated the MoonRay Render Settings LOP HDA.

Validation

Validated against Houdini 20.5.584:

  • DCC validation: SUMMARY PASS=59 FAIL=0 SKIP=6
  • Source/install Python and HDA payloads match by SHA-256
  • Manual husk explicit -o writes a valid nonconstant EXR
  • Absolute RenderProduct.productName fallback writes a valid nonconstant EXR
  • Plain USD Render ROP with blank outputimage and concrete RenderProduct.productName writes a valid nonconstant EXR
  • Owned MoonRay ROP output override writes a valid nonconstant EXR
  • Saved HIP $HIP output path writes under the saved HIP directory
  • Default $HIP/render/$HIPNAME.$OS.$F4.exr now evaluates with populated $HIPNAME and $OS in the owned ROP path
  • git diff --check passed
  • aovsupport=true remains enabled

Still open

This does not address the next Render Settings issues yet:

  • Sampling/export needs a separate audit. The inspected USD currently authors sampling_mode = "uniform" with pixel_samples = 8, while adaptive settings are also present.
  • Frame range handoff still needs validation beyond USD layer metadata.
  • GUI/ROP repeated sync/restart behavior still needs investigation:
    • MCRT: Detected change in resolution
    • Starting Rendering (syncId:2/3/4)
  • EXR metadata is still weak: OIIO reports only oiio:ColorSpace = "Linear", without a specific working gamut.
  • EXR renderTime_s and renderMemory_s metadata appears incorrect and needs a separate metadata pass.

@rolledhand

Copy link
Copy Markdown
Author

Also there's a time dependency now, but that'd be an easy fix once the more important issues are fixed.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

Fixed the time dependency and switching uniform/adaptive in the dropdown now works correctly with "greying out" the adaptive/uniform sampling in the native LOP.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

Native AOV zero-fill root cause found and repaired

I ran a full fix-and-prove pass for the production native AOV zero-fill issue on the H20.5.584 MoonRay/Houdini/Solaris stack.

The important result is that the zero-fill was not caused by USD RenderVar authoring, RenderBuffer lookup, RDLA declaration, or final EXR writing.

Temporary sender/receiver diagnostics showed:

  • mcrt had active, finite, nonzero native AOV values before encoding.
  • The receiver saw zero values immediately after PackTiles::decodeRenderOutput().
  • A sender-side self-decode of the freshly encoded packet also produced zeros.

That narrowed the first proven data loss to the H16 PackTiles encode/decode path.

A standalone Apple Silicon repro then confirmed the root cause: the existing ARM NEON scalar half conversion corrupted values such as 5.12391 into near-zero half data. The scalar __fp16 path produced the expected half value. The Apple path now uses scalar __fp16 conversion plus std::memcpy bit transport, while the non-Apple path remains unchanged.

What changed

  1. Fixed Apple Silicon H16 PackTiles conversion

    • scene_rdl2/lib/common/grid_util/PackTiles.cc
    • Replaced the broken ARM scalar half conversion path with scalar __fp16 conversion plus std::memcpy.
    • This fixes H16 PackTiles payload corruption in the production Arras AOV path.
  2. Fixed matching native MoonRay half output conversion

    • moonray/lib/rendering/rndr/RenderOutputWriter.cc
    • Applied the same Apple Silicon half conversion fix for native MoonRay half output writing.
  3. Fixed pre-bind Arras RenderBuffer allocation

    • moonray/hydra/hdMoonray/plugin/hd_moonray/ArrasRenderer.cc
    • Pre-bind allocation now honors the requested channel count.
    • Buffers are cleared/reallocated when size or channel count changes.
    • This avoids treating every unresolved pre-bind buffer as Beauty/RGBA before the RenderOutput is bound.
  4. Updated hdMoonray docs

    • Marked the old native AOV zero-fill baseline as historical/superseded.
    • Documented the Apple Silicon half-packing root cause and the repaired production AOV baseline.

Validation

Validated against Houdini 20.5.584 with production HdMoonrayRendererPlugin.

Rebuilt and installed/signed the affected runtime libraries:

  • libcommon_grid_util.dylib
  • librendering_rndr.dylib
  • libgrid_engine_tool.dylib
  • libclient_receiver.dylib
  • hd_moonray.dylib

Confirmed:

  • husk --list-renderers still lists MoonRay and MoonRay debug.
  • aovsupport=true remains enabled.
  • Temporary diagnostic strings were removed from installed dylibs.
  • No source/build/install *cameraDepth* or *native_aov* scratch files were left behind.
  • git diff --check passed across the touched repos.

Production HdMoonrayRendererPlugin now writes filled EXRs for explicit RenderVar tests:

  • Beauty/color
  • alpha
  • depth
  • cameraDepth
  • Z
  • N
  • Ng
  • P
  • Wp
  • St
  • weight, constant nonzero in the simple fully sampled fixture

Still open

This pass does not claim to solve the broader AOV/UI surface yet:

  • Broad AOV UI exposure is still deferred.
  • Multi-AOV products are not validated yet.
  • Material AOVs, LPEs, visibility AOVs, primvars, Cryptomatte, and motion vectors still need separate validation.
  • Sampling live-update and repeated GUI sync/restart behavior are still not addressed.
  • The remaining Beauty bayer/stripe issue still needs a GUI/IPR pass.
  • Arras socket shutdown messages are still observed after successful writes and were not suppressed.
  • EXR renderTime_s / renderMemory_s metadata still appears incorrect and needs a separate metadata pass.

@rolledhand

rolledhand commented Jun 14, 2026

Copy link
Copy Markdown
Author

Really glad that I can share those since this one took me quite a while to get running.

Images

Screenshot 2026-06-14 at 20 25 05 Screenshot 2026-06-14 at 21 33 22

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

MoonRay native AOV / Beauty color4f checkpoint

Adding a checkpoint for the native AOV cleanup/finalization work now pinned in this branch.

This pass stabilizes the first production-validated native AOV set for the custom MoonRay Render Settings LOP and fixes the explicit Beauty RenderVar corruption seen through the Houdini/Solaris USD Render ROP path.

Commits

DCC commit:

  • e1980e564d2b440f7ea7dddfa03544b97859b19e
  • Stabilize native AOV output in MoonRay Render Settings LOP

Parent commit:

  • 0d8d2da55efbed49959939794532ab896bb87531
  • Update MoonRay DCC native AOV UI pin

Summary

The key fix in this pass is that the explicit Beauty RenderVar is now authored as color4f instead of color3f.

Previous Beauty authoring:

  • dataType = "color3f"
  • sourceName = "color"
  • driver:parameters:aov:format = "color3f"

Updated Beauty authoring:

  • dataType = "color4f"
  • sourceName = "color"
  • driver:parameters:aov:format = "color4f"

This fixes the vertical RGB/bayer-like EXR corruption seen when Beauty was authored as color3f. The evidence points to the hdMoonray explicit Beauty / color path expecting the RGBA beauty-buffer contract.

Final exposed AOV set

The custom Render Settings LOP now exposes:

  • Beauty/color
  • alpha
  • depth
  • Z
  • N
  • Ng
  • P
  • Wp
  • St
  • weight

These are the currently stabilized native outputs for the production delegate path.

cameraDepth cleanup

cameraDepth was a made up custom AOV pass for testing. It's gone and clean now.

Backend Hydra compatibility mapping was intentionally left untouched. The product-facing depth outputs are now depth and Z.

Changed areas

  • moonray_dcc_plugins/houdini/python3.11libs/moonray_render_settings.py
  • moonray_dcc_plugins/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda
  • moonray_dcc_plugins/houdini/tests/dev_validate_moonray_render_settings_lop.py
  • moonray_dcc_plugins/houdini/docs/moonray_render_settings_lop_audit.md
  • parent submodule pointer for moonray/moonray_dcc_plugins

Validation

  • Python syntax validation passed.
  • Installed H20.5 DCC validation passed:
    • SUMMARY PASS=90 FAIL=0 SKIP=6
  • git diff --check passed in parent, DCC, and hdMoonray.
  • husk --list-renderers still lists:
    • HdMoonrayRendererPlugin
    • HdMoonrayRendererDebugPlugin
  • aovsupport=true remains present in source and installed UsdRenderers.json.
  • No untracked generated junk remained before commit.

Runtime validation:

  • EXR render tested successfully.
  • Beauty color4f removes the vertical RGB/bayer-like corruption.
  • Native AOVs render filled.
  • EXR inspected with OIIO.
  • Houdini Copernicus and Nuke both read the channels correctly.

Current status

Working:

  • custom MoonRay Render Settings LOP native AOV UI
  • Beauty/color output through the explicit RenderVar path
  • Beauty authored as color4f
  • alpha
  • depth
  • Z
  • N
  • Ng
  • P
  • Wp
  • St
  • weight
  • USD Render ROP / production delegate EXR output
  • Copernicus channel reading
  • Nuke channel reading

Deferred:

  • material/OIDN AOVs, especially albedo and normal
  • LPE/light AOVs
  • visibility AOVs
  • primvar AOVs
  • motion vectors
  • Cryptomatte, if ever needed
  • adaptive sampling live-update
  • syncId restart loop
  • GLD viewport warning

Next target

The next AOV target is material/denoising auxiliary output, with priority on OIDN-ready:

  • albedo
  • normal

That pass should first check the official MoonRay RenderOutput/material AOV/OIDN denoising contract and local RenderOutput.json metadata before exposing any new controls.

Images

Screenshot 2026-06-14 at 23 33 42 Screenshot 2026-06-14 at 23 33 49 Screenshot 2026-06-14 at 23 33 54 Screenshot 2026-06-14 at 23 34 00

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

Copy link
Copy Markdown
Author

MoonRay material / denoise AOV checkpoint

Adding a checkpoint for the material and denoising AOV work now pinned in this branch.

This pass adds a separate Material / Denoise AOV section to the custom MoonRay Render Settings LOP.

Exposed and production-proven outputs:

  • Denoise Albedo
  • Denoise Normal
  • Material Albedo
  • Material Emission
  • Material Normal
  • Material Roughness
  • Material PBR Validity

The denoise outputs follow the official MoonRay denoiser contract:

  • Denoise Albedo uses D.albedo with denoiser_input = as albedo
  • Denoise Normal uses N with denoiser_input = as normal

Not exposed after testing:

  • Material Color
  • Factor
  • Radius

These were discovered but not exposed because production proof was missing or not meaningful in this pass.

Validated:

DIrectly in Houdini, oiio, etc.

@rolledhand

Copy link
Copy Markdown
Author

The following areas are intentionally deferred for now:

  • Motion vectors for post motion blur
  • LPE/light AOVs
  • visibility AOVs
  • primvars/custom attribute AOVs
  • Cryptomatte
  • syncId restart-loop cleanup
  • Arras socket shutdown message
  • GLD viewport warning

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand rolledhand force-pushed the Moonray-Houdini21-macOS branch from 271aaf7 to d169571 Compare June 15, 2026 10:24
@codesavory

Copy link
Copy Markdown

This is a ton of solid work, Jakub. The macOS/H21 build path alone is a big unblock.

Why it's stuck

  • It's one big PR mixing the build/compat fixes (done, validated) with the still-WIP shader/runtime work.
  • That bundle is hard to approve as a unit, which is likely why it's sat on REVIEW_REQUIRED.

Proposal: split it

  • Land the build/compat core on its own first: libpxr_usdRiPxrImaging rename, libpxr_python for pxr_boost::python, Boost 1.82, log4cplus, NO_USD deps, Python 3.11 paths.
  • That part is self-contained and low-risk, and gives everyone a working H21 macOS base.
  • The material/light/AOV work follows as separate PRs once stable.

How I can help

  • I'm on the same toolchain (Tahoe, Xcode 26, H21.0.631) and my build came up clean with the same fixes, so I can independently reproduce and review the build PR.
  • I can take AOVs off your next-steps list. I've already dug into the RenderVar → RenderOutput path (RenderBuffer.cc hardcoded table, Allocate() before Bind(), hd_usd2rdl only binding color).
  • Happy to split the work however suits you while you keep pushing the rest.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
@rolledhand

rolledhand commented Jun 22, 2026

Copy link
Copy Markdown
Author

Houdini 20.5 render-contract, scene-scale, and OCIO integration update

I pushed the next Houdini/MoonRay integration stack after the earlier setup and pin commits:

  • 63298dc hardened MoonRay setup path discovery.
  • 297217e updated the previously validated Houdini integration submodule pins.
  • 55e5e6b updates the parent pins again for the new render-contract / OCIO work.

This pass covered more than pure OCIO. The main goal was to make the Houdini 20.5 / Solaris / husk / hdMoonray path more coherent across render settings, scene scale, command tools, texture interpretation, and live Houdini UI.

What changed

  1. Scene scale policy

    • SceneVariables.scene_scale now defaults to 1.0. This gets rid of the overblasted normalize light value with normalize and apply scene scale turned on.
    • hdMoonray bridges USD metersPerUnit into MoonRay SceneVariables.scene_scale.
    • Explicit moonray:sceneVariable:scene_scale still wins.
    • Raw geometry/light/material/camera distance attributes are not pre-multiplied.
  2. hdMoonray RenderSettings / command-tool translation

    • hd_usd2rdl and hd_render now consume RenderSettings camera/resolution/product metadata more consistently.
    • Raw RenderProduct/RenderVar traversal is filtered in legacy command-tool paths instead of pretending Product/Var are fake Bprims.
    • RenderSettings remains the real supported Hydra Bprim path.
    • Runtime lifecycle/error reporting and OCIO diagnostics were tightened.
  3. Config-driven OCIO 2.3 color management

    • hdMoonray now resolves render/working space from the active OCIO config using roles/aliases instead of hidden ARRI/ACES/Rec709 fallback lists.
    • Render-space priority is explicit authored value, then rendering, scene_linear, default_float, reference, and finally default only as a warning fallback.
    • $OCIO state, config path, roles, resolved working space, and disabled/fallback reasons are logged at runtime.
    • Houdini-facing hdMoonray links against SideFX OCIO 2.3; MoonRay runtime texture code uses bundled standard OCIO 2.3.
  4. Texture source color-space support

    • Native ImageMap and UsdUVTexture now support config-driven source_color_space.
    • auto uses OCIO file rules.
    • raw / data bypass conversion.
    • Explicit source-space names resolve through the active config; invalid names warn instead of guessing.
    • Moonshine texture/normal/glitter callers now pass explicit auto or raw policy.
  5. Live Houdini UI exposure

    • MoonRay Render Settings LOP now exposes a config-driven renderingColorSpace menu.
    • Native MoonRay ImageMap now exposes a visible source_color_space control.
    • Menus are generated from the active OCIO config, not hardcoded to ARRI.

Validation

Validated on Houdini 20.5.584:

  • Full build completed.
  • Installed and signed updated runtime artifacts.
  • husk --list-renderers shows MoonRay and MoonRay debug.
  • hd_usd2rdl, hd_render -translate-only, and tiny husk were tested.
  • DCC validation passed: PASS=127 FAIL=0 SKIP=6.
  • Live hython proof confirmed the Render Settings renderingColorSpace control and ImageMap source_color_space control are visible from the installed HDAs.
  • OCIO configs tested:
    • arri-CG.ocio resolves via rendering. (ocio v2.3)
    • config-2020.ocio resolves via rendering. (ocio v2.0)
    • arri-original-nonCG-dontuse.ocio correctly resolves via scene_linear, not default or file rules. (ocio v2.1)
    • the OCIO 2.4 config is correctly rejected under Houdini’s OCIO 2.3 runtime. (ACES 2.0 ocio v2.4 config)
    • tested multiple different configs myself to see if the color management values change automatically and they do
    • different color management values are affecting the outcome correctly
    • EXRs are no longer rendered in a mismatching state in comparison with the IPR

Still open

This does not claim to finish every Houdini/MoonRay issue:

  • No display/view transform baking was added. It's not needed in my opinion.
  • maketx scripts and texture files were not changed.
  • Broad RenderProduct/RenderVar/AOV architecture still needs follow-up validation. There have been some adjustments, I'd not call this the final version yet.
  • Displacement signal 11 and EXR white-dot/NaN artifact investigation remain separate. This might be due to an older cache from older versions in a Houdini project, the new projects work well.

Images

Rendering colorspace working:
Screenshot 2026-06-22 at 12 05 18
Screenshot 2026-06-22 at 12 13 42
Screenshot 2026-06-22 at 12 24 29

Different config loaded different colorspaces:
Screenshot 2026-06-22 at 13 36 07

lin-rec.709 rendering space:
Screenshot 2026-06-22 at 13 16 14

lin-awg4 rendering space:
Screenshot 2026-06-22 at 13 16 18

Image map with the newly added colorspace dropdown taking an effect (lin-rec.2020 encoded albedo):
Screenshot 2026-06-22 at 13 47 59
Screenshot 2026-06-22 at 13 46 50

@rolledhand

Copy link
Copy Markdown
Author

Also forgot to mention that the current changes ensure that the time at the top right of the IPR now works properly. When the render finishes the time doesn't disappear. Was touching scene alignment a bit.

As an addition, I'd most likely mark the current native ImageMap gamma approach meaning auto, on, off as deprecated and delete it in the future since a colorspace management and tagging can take place instead. Keeping the gamma option still in for now since this isn't a small architectural decision.

I'd also add a colorspace management option for env light maps to provide the controls over it, I rarely use them so this is staying deferred at the moment.

Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants