如何为除一个对象(专注于该对象)之外的所有场景创建模糊效果?
How to create blur effect to all the scene except for one object (focus on that object)?
我想创建类似于下图的模糊效果:
图片取自本站:
https://forum.unity.com/threads/how-to-blur-specific-layers-only.555520/
我尝试了 post-processing 配置文件并尝试了 post-processing volume 中的景深,但它模糊了所有场景。
我遇到了一个 YouTube Video,它解释了如何实现与我正在寻找的结果相似的结果,但设置中的情况发生了巨大变化。例如,在 1:57(分 57 秒),他点击了 Add Additional Camera Data
,我在最新版本的 LWRP 中很难找到它。
我使用的Unity版本是2019.2.9f1
怎样才能达到上图的效果呢? (模糊除一个物体外的所有场景)
您的指导将不胜感激。
注意:我的项目在 VR 中使用 SteamVR 和 VRTK
对不想模糊的对象使用单独的相机并设置更高的深度值。
将 ClearFlags
设置为仅深度,并在 CullingMask
select 中设置一个对象(或多个对象)的图层。显然,您需要为未模糊的对象设置不同的图层。
虽然你的问题有点宽泛,但我花了一些时间向你展示如何做到这一点。
首先你需要通过PackageManager
导入Post Processing
包
Window → 包管理器
确保在 All Packages
视图中,搜索 post
,找到 Post Processing
包并点击 Install
现在首先进入图层设置 (Layers → Edit Layers)
并添加两个层:例如PostProcessing
和 Focused
现在到相机。 Afaik 无论您是否在 VR 中都没有区别,通常您有一个 MainCamera
随耳机一起移动。如果您的项目设置中应该有两个,只需对第二个摄像机重复相同的步骤。
- 确保
MainCamera
不会渲染两个添加的图层 →从 Culling Mask
中删除它们
将新相机 FocusCamera
作为 child 添加到现有 MainCamera
。这样它会自动与主相机一起移动。
右键单击 MainCamera
&rightarrow 相机
它应该具有等于 MainCamera
除了 :
的所有设置
Clear Flags
: 不清除
如果将其设置为 Depth Only
,聚焦的 object 将始终呈现在所有内容之上,即使它实际上在 3D object 之后 space。您可以在这里决定您想要的效果 ;)
CullingMask
: 仅 重点
Depth
:任何高于 MainCamera
的东西,所以这个相机在它上面渲染
- 确保删除
AudioListener
组件。
终于给场景添加一个新的PostProcessingVolume
。我会将其添加为 child 到 FocusCamera
!为什么? - 因为这样它会与 FocusCamera
一起自动禁用!
在 FocusCamera
上右键单击 → 3D Object → Post处理量
将其 Layer
设置为添加的 PostProcessing
启用Is Global
,这样与音量的距离就无关紧要了,并通过点击new添加新的配置文件→ 团结 → 景深
在您的情况下,您想要覆盖 Focus Distance
,因此选中左侧的框并设置一个靠近相机的值,例如0.5
到目前为止,您的场景中没有任何真正改变。
现在转到 MainCamera
和一个组件 PostProcessingLayer
并将 Layer
设置为我们添加的图层 PostProcessing
现在场景中的一切都应该变得模糊了!
几乎可以出发了!现在禁用 FocusCamera
并将此脚本添加到其中
using UnityEngine;
public class FocusSwitcher : MonoBehaviour
{
public string FocusedLayer = "Focused";
private GameObject currentlyFocused;
private int previousLayer;
public void SetFocused(GameObject obj)
{
// enables this camera and the postProcessingVolume which is the child
gameObject.SetActive(true);
// if something else was focused before reset it
if (currentlyFocused) currentlyFocused.layer = previousLayer;
// store and focus the new object
currentlyFocused = obj;
if (currentlyFocused)
{
previousLayer = currentlyFocused.layer;
currentlyFocused.layer = LayerMask.NameToLayer(FocusedLayer);
}
else
{
// if no object is focused disable the FocusCamera
// and PostProcessingVolume for not wasting rendering resources
gameObject.SetActive(false);
}
}
// On disable make sure to reset the current object
private void OnDisable()
{
if (currentlyFocused) currentlyFocused.layer =previousLayer;
currentlyFocused = null;
}
}
这将允许您通过将其层更改为我们添加的 Focused
层(唯一由 FocusCamera
渲染的层)来将某个游戏Object 集中在运行时。所以这个 object 将被渲染在图像之上,没有任何模糊效果!
为了演示,我刚刚将这个简单的脚本添加到每个多维数据集 object 以便在鼠标进入时启用焦点并在鼠标退出时禁用它:
using UnityEngine;
public class FocusMe : MonoBehaviour
{
[SerializeField] private FocusSwitcher focus;
private void OnMouseEnter()
{
focus.SetFocused(gameObject);
}
private void OnMouseExit()
{
// reset the focus
// in the future you should maybe check first
// if this object is actually the focused one currently
focus.SetFocused(null);
}
}
这是它的样子
如前所述,我不确切知道您的 VR 设置是什么样的。如果您必须使用 MainCameras,只需向其中添加两个 child 相机即可。你仍然只需要一个 PostProcessingVolume 和一个 FocusSwitcher
所以你可能会将它们移动到另一个 object 并以不同的方式处理相机禁用等,但我希望这个想法足够清楚。
我想创建类似于下图的模糊效果:
图片取自本站:
https://forum.unity.com/threads/how-to-blur-specific-layers-only.555520/
我尝试了 post-processing 配置文件并尝试了 post-processing volume 中的景深,但它模糊了所有场景。
我遇到了一个 YouTube Video,它解释了如何实现与我正在寻找的结果相似的结果,但设置中的情况发生了巨大变化。例如,在 1:57(分 57 秒),他点击了 Add Additional Camera Data
,我在最新版本的 LWRP 中很难找到它。
我使用的Unity版本是2019.2.9f1
怎样才能达到上图的效果呢? (模糊除一个物体外的所有场景)
您的指导将不胜感激。
注意:我的项目在 VR 中使用 SteamVR 和 VRTK
对不想模糊的对象使用单独的相机并设置更高的深度值。
将 ClearFlags
设置为仅深度,并在 CullingMask
select 中设置一个对象(或多个对象)的图层。显然,您需要为未模糊的对象设置不同的图层。
虽然你的问题有点宽泛,但我花了一些时间向你展示如何做到这一点。
首先你需要通过PackageManager
导入Post Processing
包
Window → 包管理器
确保在 All Packages
视图中,搜索 post
,找到 Post Processing
包并点击 Install
现在首先进入图层设置 (Layers → Edit Layers)
并添加两个层:例如PostProcessing
和 Focused
现在到相机。 Afaik 无论您是否在 VR 中都没有区别,通常您有一个 MainCamera
随耳机一起移动。如果您的项目设置中应该有两个,只需对第二个摄像机重复相同的步骤。
- 确保
MainCamera
不会渲染两个添加的图层 →从Culling Mask
中删除它们
将新相机
FocusCamera
作为 child 添加到现有MainCamera
。这样它会自动与主相机一起移动。右键单击
MainCamera
&rightarrow 相机它应该具有等于
的所有设置MainCamera
除了 :Clear Flags
: 不清除
如果将其设置为Depth Only
,聚焦的 object 将始终呈现在所有内容之上,即使它实际上在 3D object 之后 space。您可以在这里决定您想要的效果 ;)CullingMask
: 仅 重点Depth
:任何高于MainCamera
的东西,所以这个相机在它上面渲染- 确保删除
AudioListener
组件。
终于给场景添加一个新的
PostProcessingVolume
。我会将其添加为 child 到FocusCamera
!为什么? - 因为这样它会与FocusCamera
一起自动禁用!在
FocusCamera
上右键单击 → 3D Object → Post处理量将其
Layer
设置为添加的PostProcessing
启用
Is Global
,这样与音量的距离就无关紧要了,并通过点击new添加新的配置文件→ 团结 → 景深在您的情况下,您想要覆盖
Focus Distance
,因此选中左侧的框并设置一个靠近相机的值,例如0.5
到目前为止,您的场景中没有任何真正改变。
现在转到 MainCamera
和一个组件 PostProcessingLayer
并将 Layer
设置为我们添加的图层 PostProcessing
现在场景中的一切都应该变得模糊了!
几乎可以出发了!现在禁用 FocusCamera
并将此脚本添加到其中
using UnityEngine;
public class FocusSwitcher : MonoBehaviour
{
public string FocusedLayer = "Focused";
private GameObject currentlyFocused;
private int previousLayer;
public void SetFocused(GameObject obj)
{
// enables this camera and the postProcessingVolume which is the child
gameObject.SetActive(true);
// if something else was focused before reset it
if (currentlyFocused) currentlyFocused.layer = previousLayer;
// store and focus the new object
currentlyFocused = obj;
if (currentlyFocused)
{
previousLayer = currentlyFocused.layer;
currentlyFocused.layer = LayerMask.NameToLayer(FocusedLayer);
}
else
{
// if no object is focused disable the FocusCamera
// and PostProcessingVolume for not wasting rendering resources
gameObject.SetActive(false);
}
}
// On disable make sure to reset the current object
private void OnDisable()
{
if (currentlyFocused) currentlyFocused.layer =previousLayer;
currentlyFocused = null;
}
}
这将允许您通过将其层更改为我们添加的 Focused
层(唯一由 FocusCamera
渲染的层)来将某个游戏Object 集中在运行时。所以这个 object 将被渲染在图像之上,没有任何模糊效果!
为了演示,我刚刚将这个简单的脚本添加到每个多维数据集 object 以便在鼠标进入时启用焦点并在鼠标退出时禁用它:
using UnityEngine;
public class FocusMe : MonoBehaviour
{
[SerializeField] private FocusSwitcher focus;
private void OnMouseEnter()
{
focus.SetFocused(gameObject);
}
private void OnMouseExit()
{
// reset the focus
// in the future you should maybe check first
// if this object is actually the focused one currently
focus.SetFocused(null);
}
}
这是它的样子
如前所述,我不确切知道您的 VR 设置是什么样的。如果您必须使用 MainCameras,只需向其中添加两个 child 相机即可。你仍然只需要一个 PostProcessingVolume 和一个 FocusSwitcher
所以你可能会将它们移动到另一个 object 并以不同的方式处理相机禁用等,但我希望这个想法足够清楚。