24 July 2024
HtoA 6.3.3.0 uses Arnold 7.3.3.0 and is a minor feature release bringing a new OpenPBR surface shader, improvements to volume rendering, OIDN support for Apple Metal and AMD GPUs, and many other improvements as well as multiple bug fixes.
Download Arnold for Houdini from your Autodesk Account. See Download Arnold for more information about downloading HtoA from your Autodesk Account.
Follow these installation instructions
image courtesy of Nikie Monteleone
Convert Standard Surface shaders to OpenPBR Surfaces using the new conversion scripts
(Note: Shader parameters must be promoted for this to work in the viewport)
(Shader Developers: Custom shaders can now use the new houdini.ogl_tag
metadata to automatically tag VOP parameters with OpenGL tags):
[attr diffuse]
houdini.ogl_tag STRING "ogl_diff"
standard_volume
improve how light is scattered in volumes. Using those parameters can help achieve high-scattering looks with fewer volume bounces and without adding energy. (ARNOLD-14482)scatter_diffusion
accelerates scattering in volumes.scatter_diffusion_roughness
accelerates scattering further on anisotropic volumes and can help achieve realistic looking clouds with fewer bounces. gain
and bias
curves can further tweak the effect of both parameters Stochastic volume interpolation: The tricubic interpolation mode of AiVolumeSampleXXX()
calls, such as those used by the standard_volume
shader, now uses a stochastic method of interpolation that greatly reduces the amount of voxel data read in each sample call. In testing, we've seen speed ups of as much as 1.7x in certain scenes. Note that this technique does not always produce a perfectly matching image as a result, and can be toggled via the stochastic_volume_interpolation
render option (default is on
). (ARNOLD-3856)
Improved quality with Intel Open Image Denoise 2.3.0: The updated Intel Denoiser improves denoising quality and can produce sharper results with less artifacts on scenes with specular reflections and transmission. For more information about changes in this version, see the OIDN release notes (ARNOLD-15059).
OIDN support for Apple Metal and AMD GPU: The Intel OIDN denoiser now supports on macOS all Apple Metal GPUs (M1 and newer) and on Windows AMD GPUs using RDNA2 (Navi 21 only) and RDNA3 (Navi 3x) architectures. This allows for significantly faster denoising: on an M1 Max laptop we see 5-8x faster denoising. (ARNOLD-14855, ARNOLD-14856)
GPU Many-lights support for light linking: Arnold GPU now uses Global Light Sampling for group of lights linked to a shape. This can improve rendering performance for scenes with light linking. For example, the ALab scene now renders twice as fast when you use Global Light Sampling. (ARNOLD-15050)
GPU improved time to first pixel in scenes with many nodes: Reduced time to first pixel with Arnold GPU and scenes with many nodes. For example, we have seen a 18% improvement in time to first pixel on a simple scene with 1,000,000 instances. (ARNOLD-13652)
Motion vector AOV on GPU: The motionvector AOV is now supported when rendering on GPU. (ARNOLD-11046)
Ramp Shaders: Improved UI and new linkable inputs (HTOA-2629)
![]() |
![]() |
![]() |
![]() |
3d_linear | 3d_spherical | 3d_cylindrical |
![]() |
![]() |
![]() |
worley noise (3d_spherical) | cell_noise (u) | alligator noise (v) |
AtNode* options = AiUniverseGetOptions(universe);
const int deform_keys = AiNodeGetInt(options, 'deform_keys');
![]() |
![]() |
![]() |
![]() |
![]() |
Improved AOV memory usage in non-progressive renders: Non-progressive, adaptive renders with the box filter now use less memory. Memory usage is also reduced in non-adaptive renders when using the following filters gaussian_filter
, triangle_filter
, sinc_filter
, catrom_filter
, mitnet_filter
, blackman_harris_filter
. For example, in a 1080p render using adaptive with AA_samples_max 50 and 6 AOVs, the memory used by AOVs was reduced from 14GB to 730MB (-96%). Note also that AOV memory usage now remains constant as AA_samples_max increases, unlike previous releases where the memory would increase quadratically. (ARNOLD-10160)
Improved efficiency of the Alembic procedural: The Alembic procedural now reads data in parallel, which optimizes initialization times of heavy Alembic files with many objects. We observed startup times going from 15 minutes to 4 seconds on a large production scene. (ARNOLD-14796)
Indirect diffuse and indirect specular parameters are now linkable in the standard_surface and openpbr_surface shaders: The indirect_diffuse
and indirect_specular
of standard_surface
and openpbr_surface
shaders now support linking of shaders. This should allow better optimization in scenarios where no indirect lighting is needed. (ARNOLD-14204)
Triplanar Nref user param: Triplanar shader now accepts an Nref
user parameter, to allow specifying reference normals when in Pref
mode. (ARNOLD-15063)
AOV names used for OpenImageIO subimages: Multi-part files previously used default subimage naming for layers/subimages. Arnold now uses the names of AOV outputs for the corresponding subimage. (ARNOLD-15053)
Triangle tessellation memory usage statistics grouped under polymesh memory usage: Arnold logs now list triangle tessellation and polymesh memory usage together in the peak CPU memory used and peak GPU memory consumed. (ARNOLD-15194)
ZMQ - Upgraded to ZMQ 4.3.5 (HTOA-2617)
OSL VOP - Added a manual Compile button (HTOA-1733)
![]() |
ParallelFor API: A new AiParallelFor
function allows API users to easily implement multithreading of work over an array without having to use a dedicated multi-threading library such as TBB. (ARNOLD-14966)
// simple example that squares all the elements in an array
void square(size_t array_index, void* data, void* payload)
{
float& value = *static_cast<float*>(data);
value = value * value;
}
std::array<float, 7> values = {1, 2, 3, 5, 8, 13, 21};
AiParallelFor(values.data(), sizeof(values[0]), values.size(), nullptr, square);
ParallelJobs API: A new AtParallelJobs
class allows programs to run jobs in parallel through a parallel job scheduler. This has more overhead than AiParallelFor()
, but is more flexible as it allows for dispatching jobs without needing to place all the jobs in an array. (ARNOLD-15091)
AtParallelJobs jobs;
for (size_t i = 0; i < job_count; ++i)
{
payload = create_your_payload_data();
jobs.add(payload, &callback);
}
jobs.wait();
OpenVDB preview in AiProceduralViewport: The procedural viewport preview API can now return a boundary mesh for a volume when called on a procedural containing OpenVDB volumes nodes. This is useful to render a preview of a procedural with volumes in a DCC viewport. (ARNOLD-14382)
![]() |
Shader API A new function to query whether an object is opaque or not. (ARNOLD-4919)
AI_API AI_PURE bool AiShaderGlobalsIsObjectOpaque(const AtShaderGlobals *sg);
Enum values You can now define enum values that start with a digit. (ARNOLD-15165)
const char *enum_myparam[] = { "2d_space", "3d_space", NULL };
AiParameterEnum("myparam", 0, enum_myparam);
Critical Section API Added compile guards around native_handle()
references in ai_critsec.h because it no longer exists in the STL shipped with Visual Studio v17.8+ (MSVC v14.38+).
Node API Added new API to declare an update dependency between two nodes (a dependency is when a node uses data from another node during its update). (ARNOLD-15211)
AI_API void AiNodeAddDependency(AtNode* node, const AtNode* dependency);
triangle tessellation
section. You can now find the memory usage under polymesh memory usage in peak CPU memory used or peak GPU memory consumed. (ARNOLD-15194)node_update
function should declare this dependency with the new AiNodeAddDependency
API. (ARNOLD-14973)force_update
, nodes are expected to declare dependencies on other nodes using the new AiNodeAddDependency
API, to optimize scene updates (ARNOLD-14901)