景深(Depth Of Field),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。

而景深效果是指在焦距之外的地方都是模糊的,只有焦距的地方清晰。

通过采样摄像机的深度纹理,得到当前屏幕纹理每个点的深度,使用深度值与焦距值得到每个点到焦距的距离,并使用距离来对原图像和高斯模糊处理过的图像进行插值并输出即可。

Shader代码

Shader "MyShaderTest/2_DepthOfField"
{Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_BlurMainTex("Bloom (RGB)", 2D) = "black" {}_LuminanceThreshold ("Luminance Threshold", Float) = 0.5_BlurSize ("Blur Size", Float) = 1.0_FocusStart("FocusStart", Float) = 0.4_FocusEnd("FocusEnd", Float) = 0.6}SubShader{ZTest Always Cull Off ZWrite OffCGINCLUDE#include "UnityCG.cginc"sampler2D _MainTex;half4 _MainTex_TexelSize;sampler2D _CameraDepthTexture;sampler2D _BlurMainTex;float _BlurSize;float _FocusStart;float _FocusEnd;struct v2fBlur{float4 pos : SV_POSITION;half2 uv[5] : TEXCOORD0;};//垂直方向(Y轴方向)的高斯模糊v2fBlur vertBlurVertical(appdata_img v){v2fBlur o;o.pos = UnityObjectToClipPos(v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;o.uv[2] = uv - float2(0.0, _MainTex_TexelSize.y * 1.0) * _BlurSize;o.uv[3] = uv + float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;o.uv[4] = uv - float2(0.0, _MainTex_TexelSize.y * 2.0) * _BlurSize;return o;}//水平方向(X轴方向)的高斯模糊v2fBlur vertBlurHorizontal(appdata_img v){v2fBlur o;o.pos = UnityObjectToClipPos(v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;return o;}fixed4 fragBlur(v2fBlur i) : SV_Target{float weight[3] = { 0.4026,0.2442,0.0545 };fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * weight[0];for (int it = 1; it < 3; it++){sum += tex2D(_MainTex, i.uv[it * 2 - 1]).rgb * weight[it];sum += tex2D(_MainTex, i.uv[2 * it]).rgb * weight[it];}return fixed4(sum, 1.0);}struct v2f{float4 vertex : SV_POSITION;half2 uv : TEXCOORD0;};v2f vertDepthOfField(appdata_img v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;return o;}fixed4 fragDepthOfField(v2f i) : SV_Target{float linearDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv));float distance = 0; if (linearDepth < _FocusStart){distance = abs(linearDepth - _FocusStart);}else if (linearDepth > _FocusEnd){distance = abs(linearDepth - _FocusEnd);}           half4 color = tex2D(_MainTex,i.uv);half4 blurColor = tex2D(_BlurMainTex, i.uv);color = lerp(color, blurColor, distance);return fixed4(color.rgb,1);}ENDCGPass{  CGPROGRAM  #pragma vertex vertBlurVertical #pragma fragment fragBlur ENDCG  }Pass{  CGPROGRAM  #pragma vertex vertBlurHorizontal #pragma fragment fragBlur   ENDCG  }Pass{CGPROGRAM#pragma vertex vertDepthOfField#pragma fragment fragDepthOfFieldENDCG}}FallBack Off
}

挂在Camera上的C#脚本

using UnityEngine;[ExecuteInEditMode]
public class DepthOfField : PostEffectsBase
{public Shader shader;private Material _material = null;public Material Material{get{if(_material == null)_material = CheckShaderAndMaterial(shader,_material);return _material;}}private Camera _camera;public Camera Camera{get{if (_camera == null)_camera = GetComponent<Camera>();return _camera;}}private void OnEnable(){Camera.depthTextureMode |= DepthTextureMode.Depth;}[Range(1f, 4.0f)]public int blurSpread = 2;[Range(0.01f, 1.0f)]public float focusStart = 0.1f;[Range(0.01f, 1.0f)]public float focusEnd = 0.2f;[Range(1, 4)]public int iterations = 2;private void OnRenderImage(RenderTexture source, RenderTexture destination){        if (Material != null){int rtW = source.width;int rtH = source.height;Material.SetFloat("_FocusStart", focusStart);Material.SetFloat("_FocusEnd", focusEnd);RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);buffer0.filterMode = FilterMode.Bilinear;Graphics.Blit(source, buffer0);for (int i = 0; i < iterations; i++){Material.SetFloat("_BlurSize", 1.0f + i * blurSpread);RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);Graphics.Blit(buffer0, buffer1, Material, 0);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);Graphics.Blit(buffer0, buffer1, Material, 1);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;}Material.SetTexture("_BlurMainTex", buffer0);Graphics.Blit(source, destination,Material,2);RenderTexture.ReleaseTemporary(buffer0);}else{Debug.Log("没有shader,没法干活儿");Graphics.Blit(source, destination);}}
}

【Shader】实验02——后处理实现景深效果相关推荐

  1. Unity 屏幕特效 之 简单地使用 Shader 获取深度,实现景深效果

    Unity 屏幕特效 之 简单地使用 Shader 获取深度,实现景深效果 目录

  2. (一)unity shader在实际项目中出现的问题————unity的后处理插件景深效果在某些低档机(如三星)无效的解决方案

    本专栏主要解决一些移动平台上unity shader效果异常的问题.很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年 ...

  3. 【Shader】实验06——后处理实现色散效果

    上次写完那坨固态水之后,就想试着写一个比较节省性能比较省的一片水试试,然鹅,天有不测风云,人有旦夕祸福,我不幸地沉迷于空洞骑士,每天都沉迷于打boss与跑尸乐此不疲-- 我自己都觉得好悔恨,好罪恶,怎 ...

  4. [OpenGL] 屏幕后处理:景深效果

    开发环境:Qt, OpenGL 立方体纹理是Qt官方教程Cube里自带的纹理. 概念引入 景深是摄像中的术语.相机聚焦后,镜头前远近平面之间的物体能够清晰成像,这一段清晰成像的距离也就是景深,我们可以 ...

  5. Unity URP世界空间后处理扫描圈效果Shader

    实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的 ...

  6. unity shader景深效果

    实现效果 景深效果 实现思路 由两张图组成,分别是远处的模糊状态和近处的清晰状态,根据物体的深度判断物体离摄像机的距离确定物体的状态.两个图进行插值,越近越靠近清晰的图像. 代码 脚本代码: usin ...

  7. Unity Shader PostProcessing - 7 - DepthOfField(DOF)景深

    文章目录 基本概念 实现 列举需要的参数 在Scene视图下显示Gizmos 在Shader中标出有效景深深度 添加高斯模糊处理 将提取的景深与高斯模糊图混合 再次将平滑过的景深与模糊的图片进行融合 ...

  8. 用Unity实现景深效果

    用Unity实现景深效果 景深也是一种非常常见的后处理手段,它用来模拟相机拍摄画面的效果.今天我们讨论如何在Unity中实现它. 简单来说,景深效果可以拆分为两个部分,一个部分是聚焦,使画面中指定的区 ...

  9. webgl - 实现景深效果(一)

    webgl - 实现景深效果(一) 前言 最近对摄影颇有兴趣,入了一个定焦头,能拍出有景深效果的片了.因为对景深效果有点着迷,就想着在渲染中能不能实现类似的效果.玩了八方旅人之后发觉是这是可行的,于是 ...

最新文章

  1. java 使用 idea 调试 ysoserial
  2. Z.XML第二次迭代分数分配
  3. java protobuf 例子_用 Maven 实现一个 protobuf 的 Java语言例子
  4. JS学习--Date对象
  5. 前端学习(1155):常量const03
  6. python 类不实例化方法:@staticmethod或@classmethod
  7. FPGA设计思想与技巧
  8. MongoDB的存储结构及对空间使用率的影响
  9. 解决win2003默认不能使用移动硬盘的问题
  10. 第五十篇、OC中常用的第三插件
  11. python内置max()、min()函数与Numpy自带的max()、min()函数性能对比分析
  12. python id函数 引用本身地址_Python 之引用
  13. NMEA0183协议中的GGA语句解析
  14. 数据结构题及c语言版 答案,数据结构(C语言版)1800道题及答案[完整版]
  15. 【Soil texture】土壤质地计算器
  16. 【计算机视觉】 opencv双目视觉 立体视觉 三维重建 之理论篇
  17. 网页添加 Live2D 看板娘
  18. Linux系统下搭建域名服务器 (转http://elaine.blog.51cto.com/336598/65449)
  19. linux 离线迅雷下载软件,Linux 迅雷离线客户端!!!!!!!!!!!!
  20. jboss启动oracle表不存在,JBoss的部署及运行

热门文章

  1. Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)
  2. CentOS7.8下Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)
  3. windows cmd设置ip\dns地址
  4. APFS 强在哪里?
  5. 用计算机处理图像属于啥技术,计算机技术在图像处理中的应用
  6. 联考事业单位计算机类面试,2018年5.26事业单位联考E类常见面试题(下)
  7. 【论文翻译】Toward Learning Trustworthily from Data Combining Privacy, Fairness, and Explainability_【4】
  8. 关于window10和爱剪辑软件的兼容出错问题。
  9. GR-Fusion:强鲁棒低漂移的多传感器融合系统(IROS2021)
  10. (程序人生也需要养生)李时珍告诉你怎么不得病