景深在后处理阶段完成:利用一张景深mask,将模糊处理的正常图片与原图做差值
景深mask制作:
1. 获取摄像机深度纹理,在unity中深度图挂载到实时光源上,如果使用烘焙灯则需要强制获取,添加代码:
private Camera currentCamera = null;
void Awake(){
currentCamera = GetComponent();
}
void OnEnable(){
currentCamera.depthTextureMode |= DepthTextureMode.Depth;
}
void OnDisable(){
currentCamera.depthTextureMode &= -DepthTextureMode.Depth;
}
2. 制作mask
_ProjectionParams.z:摄像机远裁面,由于在实际项目中景深效果一直跟随角色,不应该受到远裁面的影响,所以在获取深度信息时要乘以这个值。
定义景深值和焦距,焦距-景深 = 前焦,焦距+景深 = 远焦。当深度值小于前焦,景深用前焦-深度值,当深度值大于远焦,景深用深度值-远焦,加绝对值。
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag // 顶点着色器和片源着色器声明
#include "UnityCG.cginc"
struct appdata{ // 顶点着色器输入结构体,位置和UV
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f{ // 顶点着色器输出结构体,位置和UV
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
sampler2D _BlurTex; // 模糊后的纹理
sampler2D _CameraDepthTexture; // 相机深度纹理
float4 _BlurOffset; // 模糊范围偏移
float _FocusDistance, _DepthOfField, _DofSmoothRange; // 焦点距离,景深,光滑过度
float _Step;
v2f vert (appdata v){
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); // 对象空间转换到裁剪空间
o.uv = v.uv;
return o;
}
half4 frag (v2f i) : SV_Target{
half4 col = tex2D(_MainTex, i.uv); // 原图颜色
half4 blur_col = tex2D(_BlurTex, i.uv); // 模糊后的颜色
// half depth = Linear01Depth(tex2D(_CameraDepthTexture, i.uv)); // 避免远裁面的值对景深效果的影响
half depth = Linear01Depth(tex2D(_CameraDepthTexture, i.uv)).r * _ProjectionParams.z * _Step;//避免远裁面的值对景深效果的影响
float focusNear = _FocusDistance - _DepthOfField; // 近焦距点
float focusFar = _FocusDistance + _DepthOfField; // 远焦距点
half final_depth = 0;
if((depth>=focusNear)&&(depth
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?