Principled BSDF – Cycles gets a native PBR shader


(The spaceship chairs from Homeward, updated with the new shader)

If you open a build of what will become Blender 2.79 and create a material, you’ll find yourself face to face with a giant, unfamiliar node. Although if you’ve used the Renderman plugin, or worked in apps like Houdini or Unreal, you might recognize this node after a second. It’s an implementation of Disney’s Principled BSDF, and it’s Cycles’ new physical uber shader. The principled shader has become something of a de facto standard “PBR” shader. It’s the viewport shader in Substance Painter/Designer, and it is used in a number of other tools as well.

This means we’re done with PBR hack node groups. No more simple_pbr_v5 (which was your favorite PBR hack group, rite?), no more fresnel node setups. No more appending nodes every project. It’s over, you’re free. It’s all one built in node now, and it works just like the shaders in, say, Unreal. Or Substance. Or Renderman. Or Mantra.

First of all, some background on the Principled Shader:

If you’re just looking in that paper for what the parameters are, skip over the mumbo jumbo down to section 5.2. It even includes helpful example renders.


So how do you hook up base color, roughness, metallic, and normal maps to this shader? Like this:


Normal map needs to be passed through the normal map node still, and remember that roughness, metallic, and normal maps are “non color data”, not managed “color” textures!

As another benefit, the principled shader is also implemented in OpenGL! Cycles material draw mode does not use scene lights, so you still have solid lights. But the result is far more accurate than our old node groups:


And now, answers to questions that are likely to come up:

Does this work on GPUs?

Yes, both CUDA and OpenCL.


Do I need to square roughness?/Roughness does not match the Glossy BSDF

The Principled BSDF squares roughness internally. This is generally easier to control, and allows better compatibility with other software. If you need to match a value you had on the glossy bsdf, just type in <value> ^ 0.5, Blender will calculate the equivalent.


Do I still need to account for roughness in fresnel?

Nope. Roughness is correctly handled within the shader. Just plug in your roughness map and go.


I see there’s a specular input. Do I need to export a specular map from Substance?

No! The specular slider is mainly there to tweak reflection brightness. Generally, you can leave that as 0.5 to start and adjust up or down if you need weaker or stronger reflections. If you want to match Substance, leave it at 0.5 (that’s what Substance’s viewport does).

It actually corresponds to IOR where 0-1 is equivalent to an IOR range of 1.0-1.8. The default is 0.5, which corresponds to an IOR of 1.5. (for reference, in the typical PBR Specular workflow IOR=1.5 corresponds to a specular value of 0.04).


Some other apps allows emission or tinted refraction in the principled shader. Is this not supported in Cycles?

Cycles already has easy and fast ways to do these that still work with the principled shader, so they’re not integrated. For emission, simply combine the Principled Shader node with an Emission Shader node using the Add Shader. For tinted refraction, add a volume absorption node to the volume output.


What are the limitations of the shader in material draw view (OpenGL) compared to the full render in Cycles?

  • Anisotropy does not respect custom tangents
  • Refraction is not supported
  • SSS is a very limited approximation
  • Only solid mode lighting, aka Blender’s “OpenGL Lights” are supported. This is a general limitation of Cycles material draw view