- Home /
How to make foreground blury but not the skybox?
I got a terrain, and i wan't to make it blurry in foreground. But when i do it with DOF my skybox become blurry too. Is it possible to prevent my skybox from blur?
Thx
looking for solution to similar problem, still no answer
How about having the skybox rendered by a different camera?
you would have to make use of shaders wouldn't you?
Answer by kpatelPro · Sep 15, 2015 at 01:03 AM
This is fairly easy to accomplish. You'll need to find the part of the shader where it samples the DepthBuffer, and change it such that if it gets back the maximum depth, it uses the focal depth instead.
For example, I am using component "Depth of Field (Lens Blur, Scatter, DX11...)" and with my current settings this is implemented using DepthOfFieldScatter.shader. In that file, making the following change to function fragCaptureCoc will keep the skybox from getting blurred:
float d = SAMPLE_DEPTH_TEXTURE(_GBuffer, i.uv1.xy);
d = Linear01Depth (d);
+float isSkybox = floor(d);
+d = lerp(d, _CurveParams.w, isSkybox);
(add the lines marked with a +, without the + itself)
This definitely sounds like what I'm looking for, everyone keeps saying it's impossible! I suck at shaders though, could you show how to change $$anonymous$$obileBlur.shader to achieve this? Rather than just leave the skybox unblurred like Viluredfish was trying to do, I'm actually looking for a way to leave everything other than the depth of this one camera unblurred. Thanks a million if you can help @kpatelPro!
Hi @SullyTheStrange. Sorry for the late reply. I'm not quite sure how to answer. I took a quick look at the shader and it is designed for speed. $$anonymous$$aking a change similar to this might cause the shader to become significantly slower and take more memory.
No problem @kpatelPro. I ended up cobbling together a method using some rendertexture tomfoolery which is probably also much more inefficient, but it seems there's no efficient way to do it so it'll have to do.
Answer by Julien-Lynge · Jan 11, 2013 at 06:32 PM
As @robertbu stated, you could do this with different cameras. If you had one rendering your scene (with clear flags set to depth only), and had another camera (with a lower depth) render the skybox only (LayerMask set to none, clear flags set to skybox), then you could render the skybox and then paint the scene over it with the second camera. BTW: both cameras would be in the same position and orientation in the scene (technically position isn't important, just orientation, but it's easiest to make one be the child of the other).
If you have any questions about using multiple cameras, and what layermasks and clear flags are, check the camera documentation and check around here and the forums - there are a number of posts on doing so.
Unfortunately this won't work because applying an effect like DOF or Blur on a camera with higher Depth will affect all the other camera with lower depth including the one with the skybox. I'm trying to find a solution to a similar problem and still investigating...