Interesting post from AnswerHub on how to setup a Layer Car Paint shader

Congrats, Vince! :slight_smile:

Video Tutorials - Marketplace Materials

Thanks everyone!

I just finished uploading the final video tutorial, going over the system. If anyone is interested in learning more about the flexibility of the system, or wants to learn about the materials they bought, you can find the full list of videos on my website:

Or you can watch the playlist right here:

Here is a little taste - Video 1 of 5

I followed tutorial on your website and result is amazing. I’m creating a garage setting for car renderings. as you have said, SceneCaptureCube method really is taxing, especially in interior with many lights. I only get 10-15 fps when walking around a car (exterior is fine). as I’m still fairly new to UE4 and I haven’t managed to make clear coat shader to work. but, it’s good you can save captured reflection to EXR file and use that instead of a real time capture and delete SceneCaptureCube, which skyrocketed my fps immediately. of course, this is only good if a car’s not moving anywhere, which it isn’t in my case. :wink:

thank you for sharing. shader is awesome, great work!

Thanks Hera!

The scene capture cube is certainly one of the most taxing actors in any given scene. Thankfully there are some tools in place which allow us to get some performance scaling. Check out the video I have here:

I go over some of the techniques I use to bring up the FPS, using the capture cube.

In the future I would like to cut down the cost of performance even further. I think there might be a good way to get a hybrid system running. I am imagining a system where only certain angles of reflections are calculated through a 2D capture actor, and the rest are handled with the standard reflection tools. In theory, such a system could cut performance cost by 84%

Now that the first collection of materials have been released I can spend some time in R&D. Mad material scientist! I’ll keep this post updated with my results. =)

Gdc - 2015

It is here! I am currently in San Francisco, waiting for the CA orientation to start. This year is going to be the biggest yet! For all those attending, send me a message if you want to chat or grab a beer.

Right before I left for Cali, I put together a quick scene with some old animations for my in development title: Cafe Races. I thought I would share it here! This game was the reason I started the car paint material project.

Stimpanzee, thank you for tutorial. Material looks great! But i have some trouble with reflection after packaging. I found nodes, that give this problem. I am asked this question here but dont have any answer. Have anybody tried to package this(or material that using cubemap generated by SceneCaptureCUbe) material in 4.9 (in another version i don’t tried to package)?

Hey Stimpanzee I think you will enjoy this.

For an epic friday project a couple months ago I added a new secondary bottom normal map input to the clear coat shading model so you can get accurate shading for carbon fiber substrate as well as attempt to create metallic flakes using a noisy normal. It is not checked in yet (it needs to go through code review as I am not a full fledged coder) but there is a chance this will make it in by 4.11 or so. Currently this is implemented as a project setting that has to be enabled since there is some rendering overhead any time you introduce more dynamic branching into the deferred rendering path.



quick attempt at flakes with a normal map (tempAA is off since tempAA kind of removes the sparkles unfortunately):

The basic gist of how its done:
-New normal map input via “Custom Output” node (same system used for landscape grass)
-Normalmap is packed into gbuffer using vector to octahedron since we only have 2 spare gbuffer channels to store in (custom data had a single channel left and opacity). Note that this packed normal is 8-bit which is why I chose to make the bottom normal the secondary rather than the top (top requires full precision for smooth vertex normals).
-Still in the bass pass, the clearcoat mask value is packed as 7-bit and if there has been a custom-output clearcoat bottom normal node placed, write a 1 into the free bit in CC mask, else write a 0.
-Then its a branched IF inside of the clearcoat shading model that unpacks the bit from the clearcoat mask. If the bit is 0, do the standard clearcoat shader. If the bit is 1, do the extra work for the bottom normal.


I actually was going to request this feature be added to clear coat, but I thought you guys had more important things to do (this was back around 4.5’s release). Thank you so much!

Out of curiosity, how much overhead are we talking?

I have not had time to test it for performance since messing with it. It can be difficult to say though since this kind of overhead cost can be very platform specific. Sometimes the overhead is merely from having more temporary variables in the overall shader file which even if many of them are not used (due to branch always being disabled etc), can cause the GPU to process things less efficiently. But sometimes that cost may only show up on ps4 for instance. In practice on PC with a decent video card it is probably hard to measure the cost since it will be very small. But when enabled, it makes all clearcoat materials go up in instruction count a bit. I can’t remember exactly how much but it wasn’t double or anything crazy. If you enable it in project settings but don’t use the bottom normal, it will still add some cost to the clear coat deferred shading since it has to check if the pixels encoded the bottom normal mask. For materials that do not use it, it will not really do that much extra work but the extra variables in the shader may cost something small.

GPUs try to parallelize things they will ‘make room’ for variables they don’t know they won’t need which is why unused extra variables can hurt in some cases.

This is fantastic, Ryan! You are the man!

This is exactly what I was hoping to see one day. The cost of running a scene capture has always been the biggest drawback of my system, but it was impossible to achieve the subsurface details without the multi-layered approach. Replacing the scene capture with your new method will cut performance considerably, and retain the eye candy!

I will have to revisit my materials and incorporate your method for the standard reflections model. Your results already match the quality I was able to achieve! Whatever performance hit it brings will certainly be less of a blow than rendering a separate 360.

Your solution is very clever, but it’s a little over my head! haha. I need to buckle down and get back into advanced material creation. Still lots to learn!

Hey Cyber Katana,

I believe the issue you are running into has to do with the Scene Capture Actor, within your scene. By default the actor is set to “Capture Every Frame.” You can find that check box within the details panel.

After you have built your project, and the surface turns green, it means that the scene capture actor is not running. The “Cube Render Target” texture is returning a null, which in this case is green.

There are two solutions:
#1 - If you want the scene capture actor to render reflections for every frame - make sure the check-box for “Capture Every Frame” is checked on.
#2 - If you would like the reflections to be static, you can right click on the “Cube Render Target” and select “Create Static Texture.” Then all you need to do is replace the Cube Render Target in your material with the new static texture.

**Note: **Scene Capture Actors are extremely expensive to use realtime (capture every frame) but there are ways to improve it’s performance cost. Check out the video I have here for more info on optimization:Youtube Video

You are right! After making static texture material not green anemore. Thank you very much!

Thanks for the Great material, I followed your tutorial and made the entire material from scratch, Even though it took me two days for it, I learned a lot!
But inbetween, I got an error saying Warning: Compilation errors in this material “*the current material has compilation errors, so it will not render correctly in feature level ES2. Are you sure you wish to continue? *”

What am i missing? and how to rectify this error?

Hey ifthikhar,

Usually I see this error when there is something wrong with the texture parameter, or texture sample node. But it’s possible that your error might be coming from somewhere else.

When you see the error, does the material editor point out a particular node which is causing the error?


I am interested in your material but I would like to know if it works on 4.12. I understand that there are many changes in 4.12 that impact the material, from the dual normal clear coat shading model to the custom resolution of the reflection captures … what are your plans for the material?

Hey rranon,

There is a big update coming soon!

-New optimized variants of each material (Unique VR ready materials)
-Support for multiple normal maps, thanks to the improved clear coat method
-New video tutorial explaining the new clear coat method and getting the most out of it, including the improved reflection capture actors.
-Finally, a new tutorial on practical applications: A comprehensive walk-though of my techniques for matching reference and achieving photo-realism.

I’m currently wrapping up my own VR automotive project, but I should have time to update the marketplace package this weekend. (fingers crossed)
The tutorials should be ready the following week.


I could need your materials for a project I am doing now, so the sooner you update to 4.12, the better :slight_smile:

I noticed you updated the materials to 4.12 and I bought them.
A few questions:

  • what are the differences between the VR and the non VR materials?
  • what are the differences between e.g. car_paint_s and car_paint_s_s?
  • have you tried using your materials on mobile? if yes, which ones would you suggest?

Thanks and big ups for the very nice work!


-The VR materials have had a majority of the parameters removed for the highest level of performance. Car paint materials are inherently complex because of the multiple layers in real world car paint, but the VR versions of these materials have the fewest operations to achieve the result.

-The first S in the name denotes that the material is part of the “standard reflections” group. Those materials are fully PBR safe and take advantage of UE4’s built-in reflection systems. CarPaint_R is in the “Reflections” group. It uses a complex masking system and scene capture cubes to render the top clear coat layer in the paint.

The second “s” in car_paint_S_S stands for simple. Those materials are simplified versions and have had the complex masking and rust systems removed. car_paint_s_s was built because, more often than not, developers don’t need rust or pin stripes. If you create a material instance from one of the “simple” paint master materials, you will notice a reduction in parameters. I haven’t counted, but the simple versions of the car paint have somewhere between 20-40% fewer parameters to adjust.

-The car paint materials only take advantage of the standard set of inputs: BaseColor, Roughness, Metallic, Specular, Normal, Emissive
All of the materials are relatively expensive in compute performance, but they will all run in ES2. I would recommend using the VR versions of either the “R” reflections or “S” standard car paints. Because the VR variants offer the best performance, you won’t have to sacrifice many other features to get it running on mobile.

Let me know if you have any more questions! The tutorials are still coming along and should be out soon!


It has been a long time since I’ve created the car paint materials but I have not had the chance to show off how I use them! In the past year and a half I’ve used my paint system for projects and VR configurators for the likes of Porsche, Alfa Romeo, Audi, Volkswagen, and most recently Toyota.

Now you can see my latest work in video form! For this piece, I was responsible for: rendering/editing, materials, and a good majority of the lighting. Rendering 360s out of Unreal has been a fun challenge. Just another example of how versatile it is.