Rhino 8 Feature: Native GPU procedural texture support

Hello!

I’ve been working on adding native GPU procedural texture support for Rhino. This means that Rhino’s procedural textures are evaluated on the GPU in real-time, which means they are always crisp, and updating the procedural parameters is much more responsive.

Previously Rhino needed to “bake” most procedurals into textures, which could often be slow and required large amounts of memory, especially if these procedurals were assigned to many individual objects. Baked textures could also sometimes look very pixellated, especially up-close. Native GPU procedural support aims to solve these problems.

Here’s a video showcasing the difference native procedural support can make:

And another video highlighting the improved responsiveness when changing procedural texture parameters:

In order to use the new native procedurals you don’t have to do anything differently - just create procedural textures like you’ve always done! Your old models will also automatically use the new procedurals.

In the currently available WIP, all procedural textures are evaluated on the GPU in Rendered mode, Raytraced mode and when doing production renders using Rhino Render, with the following exceptions:

  • On Windows, native procedural textures are currently only supported on NVIDIA GPUs. If you don’t have an NVIDIA GPU you can still enjoy native procedurals using CPU rendering with Raytraced and Rhino Render.
  • On Mac, certain older devices do not currently support native procedural textures.
  • When using Raytraced and Rhino Render, the following procedurals are currently not supported natively:
    • Dots texture
    • Resample texture
    • Gradient texture when using a custom gradient curve.

Check this link to see available procedural textures in Rhino.

Please test it out and let me know what you think!

20 Likes

This is how a procedural wood texture looks in Keyshot:

And here’s the same object in Rhino rendered viewport with Planar mapping:

And now with Planar (UVW) mapping:

Pretty cool!

Could any of these new procedural textures be used to create a Cutaway material?

2 Likes

Hi @martinsiegrist ,

Yes, it is pretty cool! You can use the procedural textures with a UVW planar map to create 3D procedurals (e.g. cutaway materials). The real advantage in v8 is that they show up crisp right away and there’s no waiting for them to bake in the viewport. This makes it a lot more fun to layer the possibilities.

3D_procedurals.3dm (752.5 KB)

2 Likes

Hi @BrianJ and @DavidEranen,

it’s great to see some work is done in regards to procedurals finally. The crispness is useful for color textures but have you tried to use these procedurals for displacements ? To get usable results, each procedural would need some kind of blur. Would it be possible to add this parameter to each of the procedural textures to get what the Resample texture shader was capable of ?

thanks,
c.

I’m not sure if we’re talking about the same?

In Keyshot I’m using a cutaway material to visualize holes in textured climbing wall panels.

The holes only exist as cylindrical objects. I’m using a block to keep model size as small as possible. The panel does not have any holes in Rhino.

Would something like this be possible in Rhino too?

Yes, that is something different. I don’t know what that would entail development wise to do in Rhino but it likely wouldn’t happen for 8. It looks like it uses an alpha image and then something else defining the mesh perpendicular to the visual holes. Maybe a separate post would be best so the idea doesn’t get lost within this thread. The closest approach possible now in Rhino would be by using PBR or object displacement but it would require a very dense render mesh.

I’d prefer the displacement property to have a blur option built in regardless of the texture map used.

Thanks Brian there’s already a request for a cutaway material in a post from 2020

https://mcneel.myjetbrains.com/youtrack/issue/RH-3952

Hi @BrianJ, yes the displacement modifier would benefit from it too. But i guess nobody is using this since it is somewhat slow even when you use the lowest setting and Refinement=0. It also does not weld properly…

The physical material’s normal displacement could benefit from a blur setting as well, but this is also unusable as it is impossible to control the displacement direction (it always displaces in both directions)…

Bottom line, we’re stuck with using images for displacement, blur them with photoshop and create the meshes ourself to displace them using custom code.

btw. are the gpu procedurals bakeable ?

_
c.

Okay thanks, that is on @stevebaer 's list for the future, he’d need to comment on the priority given other projects but it’s pretty old already.

1 Like

The color picker now has an Opacity value so you can make the white in say a dot texture completely transparent. That value will then not displace the objects render mesh.

I use object displacement myself but never set the refinement to 0, either the default on .5 or 1. You can alternately adjust it in other ways. I’d need to see the example showing the welding issues to help there.

Can you make a separate post for questions about displacement please? I may be able to help with some of the issues you mentioned but I don’t think they are connected to procedural textures not needing to get baked in v8.

What is the process if we want to modify or create a new procedural texture and add it to rhino? I found Shaderconverter.cs which describe the Procedural class and I found some idea to improve the Wood procedural adding some grain parametrically, and would like to test some Z noise to create modulation in the height of the wood, Is thee-re a simple way to create a new class and test it?

Thanks for your help

Thank you all for the hard work creating procedural textures! would love to know if it’s possible to have a running bond line pattern and parallel line pattern added to procedural? would be very useful

Hi @Iyang_Huang ,

I’d look at using the existing Tile texture as a starting point for this type of procedural.

I’ve also filed https://mcneel.myjetbrains.com/youtrack/issue/RH-85317 for future reference as a feature request.

1 Like

Hi @BrianJ the file in this post above opened in latest Rhino 9 doesn’t look right with Direct3D

System Info Rhino 9 Direct3D

Rhino 9 SR0 2025-7-15 (Rhino WIP, 9.0.25196.12305, Git hash:master @ 9639bf30c8f88fa73b762adfb15a9b170cd9bfae)
License type: Commercial, build 2025-07-15
License details: Cloud Zoo
Expires on: 2025-08-29

Windows 11 (10.0.26100 SR0.0) or greater (Physical RAM: 128GB)
.NET 9.0.7

Computer platform: DESKTOP

Standard graphics configuration using DirectX
Primary display: NVIDIA RTX A5000 (NVidia) Memory: 24GB, Driver date: 5-12-2025 (M-D-Y). DirectX(11)
> Accelerated graphics device with 4 adapter port(s)
- Windows Main Display attached to adapter port #0
- Secondary monitor attached to adapter port #1

Secondary graphics devices.
NVIDIA RTX A5000 (NVidia) Memory: 24GB, Driver date: 5-12-2025 (M-D-Y).
> Accelerated graphics device with 4 adapter port(s)
- Windows Main Display attached to adapter port #0
- Secondary monitor attached to adapter port #1
Microsoft Basic Render Driver (Microsoft) Memory: 64GB, Driver date: 0-0-0 (M-D-Y).
> Software simulation device with 0 adapter port(s)
- There are no monitors attached to this device!

DirectX Settings
Safe mode: Off

OpenBLAS: OpenBLAS 0.3.29 DYNAMIC_ARCH NO_AFFINITY Zen MAX_THREADS=64.

Rhino plugins that do not ship with Rhino
C:\Program Files\Rhino 9 WIP\Plug-ins\UpdatesAndStatistics\UpdatesAndStatistics.rhp “UpdatesAndStatistics” 9.0.25196.12305

Rhino plugins that ship with Rhino
C:\Program Files\Rhino 9 WIP\Plug-ins\Commands.rhp “Commands” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\WebBrowser.rhp “WebBrowser”
C:\Program Files\Rhino 9 WIP\Plug-ins\rdk.rhp “Renderer Development Kit”
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoScript.rhp “RhinoScript”
C:\Program Files\Rhino 9 WIP\Plug-ins\IdleProcessor.rhp “IdleProcessor”
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoRenderCycles.rhp “Rhino Render” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\rdk_etoui.rhp “RDK_EtoUI” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\NamedSnapshots.rhp “Snapshots”
C:\Program Files\Rhino 9 WIP\Plug-ins\MeshCommands.rhp “MeshCommands” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\IronPython\RhinoDLR_Python.rhp “IronPython” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoCycles.rhp “RhinoCycles” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\Toolbars\Toolbars.rhp “Toolbars” 9.0.25196.12305
C:\Program Files\Rhino 9 WIP\Plug-ins\3dxrhino.rhp “3Dconnexion 3D Mouse”
C:\Program Files\Rhino 9 WIP\Plug-ins\Displacement.rhp “Displacement”
C:\Program Files\Rhino 9 WIP\Plug-ins\SectionTools.rhp “SectionTools”

9 WIP OpenGL

Rhino 8 looks a bit better but the object at the right is not rendered correctly.

System Info Rhino 8

Rhino 8 SR22 2025-7-15 (Rhino 8, 8.22.25196.13001, Git hash:master @ 6ae300ea9482f9444fc9dc79cf52a528e1f505c5)
License type: Commercial, build 2025-07-15
License details: Cloud Zoo

Windows 11 (10.0.26100 SR0.0) or greater (Physical RAM: 128GB)
.NET 8.0.18

Computer platform: DESKTOP

Standard graphics configuration.
Primary display and OpenGL: NVIDIA RTX A5000 (NVidia) Memory: 24GB, Driver date: 5-12-2025 (M-D-Y). OpenGL Ver: 4.6.0 NVIDIA 573.24
> Accelerated graphics device with 4 adapter port(s)
- Windows Main Display attached to adapter port #0
- Secondary monitor attached to adapter port #1

Secondary graphics devices.
NVIDIA Quadro K2200 (NVidia) Memory: 4GB, Driver date: 5-12-2025 (M-D-Y).
> Accelerated graphics device with 4 adapter port(s)
- There are no monitors attached to this device!

OpenGL Settings
Safe mode: Off
Use accelerated hardware modes: On
GPU Tessellation is: On
Redraw scene when viewports are exposed: On
Graphics level being used: OpenGL 4.6 (primary GPU’s maximum)

Anti-alias mode: 8x
Mip Map Filtering: Linear
Anisotropic Filtering Mode: High

Vendor Name: NVIDIA Corporation
Render version: 4.6
Shading Language: 4.60 NVIDIA
Driver Date: 5-12-2025
Driver Version: 32.0.15.7324
Maximum Texture size: 32768 x 32768
Z-Buffer depth: 24 bits
Maximum Viewport size: 32768 x 32768
Total Video Memory: 24564 MB

Rhino plugins that do not ship with Rhino
C:\Users\martinsiegrist\AppData\Roaming\McNeel\Rhinoceros\packages\8.0\NVIDIADenoiser\0.4.3\NVIDIADenoiser.Windows.rhp “NVIDIADenoiser.Windows” 0.4.3.0

Rhino plugins that ship with Rhino
C:\Program Files\Rhino 8\Plug-ins\Commands.rhp “Commands” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\rdk.rhp “Renderer Development Kit”
C:\Program Files\Rhino 8\Plug-ins\RhinoRenderCycles.rhp “Rhino Render” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\rdk_etoui.rhp “RDK_EtoUI” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\NamedSnapshots.rhp “Snapshots”
C:\Program Files\Rhino 8\Plug-ins\MeshCommands.rhp “MeshCommands” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\IronPython\RhinoDLR_Python.rhp “IronPython” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\RhinoCycles.rhp “RhinoCycles” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\Grasshopper\GrasshopperPlugin.rhp “Grasshopper” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\Toolbars\Toolbars.rhp “Toolbars” 8.22.25196.13001
C:\Program Files\Rhino 8\Plug-ins\3dxrhino.rhp “3Dconnexion 3D Mouse”
C:\Program Files\Rhino 8\Plug-ins\Displacement.rhp “Displacement”
C:\Program Files\Rhino 8\Plug-ins\SectionTools.rhp “SectionTools”

That is because currently the native GPU procedural textures haven’t been ported to this tech just yet. Or at least it hasn’t been enabled yet, because of technical reasons.

1 Like

Hi @martinsiegrist ,

Thanks, filed as https://mcneel.myjetbrains.com/youtrack/issue/RH-88497

Regarding Rhino 8’s result, I’m getting the same as OpenGL in v9 WIP which looks correct here. I think the mapping type might be set to Planar UV instead of Planar UVW in your v8 screenshot.

I opened the same file in Rhino 8 and 9 WIP and it looks different. I’m using Rhino 9 WIP for most things so it’s not a problem for me right now. It’s just a bit confusing. I found the reason, Rendered view had the realtime renderer assignment set to Cycles. It looks correct with this set to ‘None’. So is there a problem with cycles?

Yes, that would cause the identical look as Planar UV and explains why I didn’t see the same since display modes are machine specific. I think that one is filed as https://mcneel.myjetbrains.com/youtrack/issue/RH-78705 but slated for 9.x apparently due to the complexity of the fix required.

1 Like