Simple PBR v4

A newwe version of Simple PBR is available here:

The original post appears below:

Oops, I kept forgetting to post this. Awhile back, I made a note on the old Simple PBR that it had some mistakes in it, and this video by CynicatPro showed a better shader:

I also mentioned I had modified Simple PBR to take these things into account. At some point I mentioned I was going to post it, but kept forgetting to, Well, some people kept commenting to remind me, so, while I watch Bob Ross on Twitch, I’ve packed it up.

Say hello to Simple PBR v4 (no, I never posted v3, it was short lived).

~~~~UPDATE July 18 2016: I’ve modified the roughness calculation for diffuse slightly. This should give less wacky results. Same download link as before ~~~~

Inside there you’ll find 4 node groups:

Simple PBR v4 – Simple PBR, which is sadly becoming a bit less simple internally, but it remains a simple metal/rough shader on the outside. This is the main shader, everything else is modifications of Simple PBR. It should work for metal and opaque dielectric surfaces.

Substance PBR v4 – Simple PBR v4, but with the roughness squared. This will make it play nice with roughness maps generated by Allegorithmic’s substance toolkit.

PBR Fresnel – a group of just the fresnel mask part. This is essentially the same as the group CynicatPro makes in his YouTube video. But it’s there if you need it (such as adding gloss to skin).

Substance Painter PBR v4 – name is a mouthful. Anyway, it’s Substance PBR v4, but with even more mods. It has a channel split and the normal map node integrated directly. It’s designed to be used with a Substance Painter export preset that is included in the bundle. That would be the “Blender Cycles.spexp” file. To install the preset, toss it in your Substance Painter shelf folder. See this doc on where to find that:

Note that these groups will not behave properly with the normal input disconnected. If you are not using a bump or normal map, feed in the default normal from the texture coordinate or geometry nodes (either works).


If you are not using Allegorithmic’s Substance tools, you can stop reading now. The rest of the post deals with integrating these shaders with the Substance twins.

The Substance Painter preset will generate 3 maps:

basecolor (nothing weird here)

“metalRough” – includes roughness in the red channel, and metalness in the green channel. The blue channel is blank.

normalOpenGL – Painter’s OpenGL Normal converted map. This map compiles your height and normal channels together with your baked normal map to create a single final normal map.

You will find corresponding inputs for each of these 3 maps on the Substance Painter PBR v4 node group. Just plug them in, and change the normalOpenGL and metalRough to non-color data (this is important, they will not work correctly as “color”). Don’t worry about adding a normal map node or splitting metalRough’s red and green channels, the node has all of that built in, then passes it to Simple PBR. Just import your textures, set non-color data on metalRough and normalOpenGL, attach them to the group, hook the group to your mat output. Nothing else to it!

Screenshot 2015-10-30 22.21.59

Remember that Substance Painter exports PNG files as 16bit, which Cycles will import as float textures. These use more memory, and if you’re rendering on an Nvidia card, you can only have 5 in your scene. Rendering on AMD? Well, you get zero. This has nothing to do with the Simple PBR shaders, just something you should be aware of. You can use a format that is 8bit in Painter, like Targa. Or just live with it.


13 thoughts on “Simple PBR v4

  1. Hi! How come the “Substance Painter PBR v4” node group has the fresnel IOR set internally? Shouldn’t it be set in accordance to whatever material you are creating, or am I missing something?

    • The substance viewport shader locks the dielectric IOR to 1.5ish, so I mimicked that here. You can always connect to a new group input if you’d prefer manual control.

  2. Hey Jason, Thanks for this posts and for all your efforts on this ! It’s great and grouping the channels into a single frame out of Substance is very clever and saves time and disk space. Great idea ! I’m still having difficulties to get to bump correct (height channel has the same issue and the mix of both too…) Is this Substance related ? I mean does their other exporters for other render Engines has special tweaks to get this correct or do they also differ from Substance itself ?
    Anyway, great work it helps a lot !

    • I don’t bother using the height channel in Blender most of the time. I’ve kinda given up figuring out how to map it to bump height in Blender or anything. The normal OpenGL layer seems to match exactly? It’s possible the green channel needs to be flipped, but I THINK (not 100% sure) that’s only if you use the DirectX normal pass, and the OGL version is already flipped. I haven’t noticed any differences between SP and Blender with the Normal OpenGL pass, but sometimes normal map axis errors can be subtle.

      • You’re right, I did check with the same HDRI map in Blender and the normals looks very close. There is some difference but I suppose it comes from the different light calculation between Substance’s OpenGL render and Cycles. Left is SP and right image is Cycles…
        But I’ve noticed a weird thing though : GPU calculation looks very different from CPU, like the nomal map or the roughness map is not used :
        Have you tried rendering with GPU ?

      • Yeah, that’s usually due to Blender loading the 16bit texture export as float, the hitting the GPU float texture limit. I never figured this one out myself until Sergey slapped down my bug report. Best workaround I’ve found is to just export an 8bit only format like tga

      • Again, you’re right for the GPU calculation. I’ve exported the maps in 8bits end it works great. Thanks a lot Jason for your advice and expertise !

  3. Pingback: Importing Substance Painter texture to Cycles | Jason's blog

  4. Pingback: Blender Cycles: Simple PBR shader | Jason's blog

  5. Hi Jason, thank you for the great shader. The only minor gripe is that displacement (in the material output node) doesn’t seem to work with it (done numerous tests).

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s