实现效果

景深效果

实现思路

由两张图组成,分别是远处的模糊状态和近处的清晰状态,根据物体的深度判断物体离摄像机的距离确定物体的状态。两个图进行插值,越近越靠近清晰的图像。

代码

脚本代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DepthOfField : PostEffectsBase
{public Shader bloomShader;private Material bloomMaterial = null;public Material material{get{bloomMaterial = CheckShaderAndCreateMaterial(bloomShader, bloomMaterial);return bloomMaterial;}}//迭代次数[Range(0, 4)]public int iterations = 3;//模糊范围[Range(0.2f, 3.0f)]public float blurSpread = 0.6f;//缩放系数[Range(1, 8)]public int downSample = 2;[Range(0.0f, 50f)]//近处与远处的分割线的距离public float Threshold = 10f;[Range(0.0f, 1.0f)]//近处的模糊系数public float NearBlurSize = 0.0f;//远处的模糊系数[Range(0.0f, 1.0f)]public float FarBlurSize = 1.0f;private Camera myCamera;public Camera camera{get{if (myCamera == null){myCamera = GetComponent<Camera>();}return myCamera;}}private Transform myCameraTransform;public Transform cameraTransform{get{if (myCameraTransform == null){myCameraTransform = camera.transform;}return myCameraTransform;}}// Start is called before the first frame updateprivate void OnEnable(){camera.depthTextureMode |= DepthTextureMode.Depth;}void Start(){}// Update is called once per framevoid Update(){}public void OnRenderImage(RenderTexture source, RenderTexture destination){if (material != null){//传参material.SetFloat("_Threshold", Threshold);material.SetFloat("_NearBlurSize", NearBlurSize);material.SetFloat("_FarBlurSize", FarBlurSize);int rtW = source.width / downSample;int rtH = source.height / downSample;RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);buffer0.filterMode = FilterMode.Bilinear;//传递清晰的图像buffer0 = source;for (int i = 0; i < 3; 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, 1);Graphics.Blit(buffer0, buffer1, material, 1);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;}//将提取出来的图像模糊处理后存储到纹理中material.SetTexture("_Blur", buffer0);//利用第四个pass将模糊的图像和原图合并起来Graphics.Blit(source, destination, material,2);RenderTexture.ReleaseTemporary(buffer0);}else{Graphics.Blit(source, destination);}}
}

shader

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/depthoffield"
{Properties{_MainTex ("Base (RGB)", 2D) = "white" {}}SubShader{CGINCLUDE#include "unityCG.cginc"sampler2D _MainTex;half4 _MainTex_TexelSize;sampler2D _Blur;float _Threshold;sampler2D _CameraDepthTexture;float _NearBlurSize;float _FarBlurSize;//混合图像的片段着色器的结构图struct v2fblur{float4 pos:SV_POSITION;//清晰和模糊的纹理坐标一致half2 uv:TEXCOORD0;//深度纹理坐标half2 uv_depth:TEXCOORD1;};//顶点着色器v2fblur vertBlur(appdata_img v){v2fblur o;o.pos =UnityObjectToClipPos(v.vertex);o.uv =v.texcoord;o.uv_depth =v.texcoord;//平台差异化处理#if UNITY_UV_STARTS_AT_TOPif(_MainTex_TexelSize.y<0.0){o.uv.y=1.0-o.uv.y;}#endifreturn o;}//片段着色器fixed4 fragBlur(v2fblur i):SV_Target{//清晰图像fixed4 maincolor = tex2D(_MainTex,i.uv);//模糊图像fixed4 blurcolor =tex2D(_Blur,i.uv);//深度值float linearDepth =LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv_depth));//与临界值的插值float dis = (linearDepth-_Threshold);if(dis<=0){dis*=_NearBlurSize;}else{dis*=_FarBlurSize;}//限定在[0,1]dis = clamp(abs(dis),0,1);//插值颜色,近处的模糊系数小,远处大return lerp(maincolor,blurcolor,dis);}ENDCGTags{"RenderType"="Opaque"}ZTest Always Cull Off ZWrite Off//模糊处理UsePass "Custom/Chapter12-GaussianBlur/GAUSSIAN_BLUR_VERTICAL"UsePass "Custom/Chapter12-GaussianBlur/GAUSSIAN_BLUR_HORIZONTAL"//混合图像passPass{CGPROGRAM#pragma vertex vertBlur#pragma fragment fragBlurENDCG}}FallBack "Diffuse"
}

unity shader景深效果相关推荐

  1. 用Unity实现景深效果

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

  2. [Unity Shader]凌波微步效果

    [Unity Shader]凌波微步效果 相信很多人都看过天龙八部,里面的段誉有一个技能就是凌波微步:移动的时候人先到,衣角跟随其后.说白了就是移动时有一个残影跟着他.下面先看下最终效果 下面我们看如 ...

  3. Unity Shader 动画效果出现残影

    问题 复现<Unity Shader入门精要>的动画效果时,我发现我的动画都出现了残影. 一开始认为是程序写错了,采样出现了问题,但是复查对比其他资料很多遍也没发现错误. 解决方法 后来反 ...

  4. Unity Shader - 描边效果

    原文链接:http://blog.csdn.net/puppet_master/article/details/54000951 简介 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个 ...

  5. Unity Shader放大镜效果

    小菜最近看到了一篇关于Shader实现的放大镜效果,酷炫的效果让小菜倍生好奇,冲动之下还是搬来练练手,刚好巩固下自己的顶点片元着色器编码. 有没有想学习的冲动!!! 文章的开始先来介绍一款好用的vs编 ...

  6. Unity Shader 新手引导效果

    这两天实现了下新手引导需要的遮罩镂空shader效果,记录一下. 1.圆形镂空shader代码: //计算片元世界坐标和目标中心位置的距离 float dis = distance(IN.worldP ...

  7. unity Shader 扭曲效果

    原理 所谓扭曲就是扰动一个物体的uv坐标,表现出来就是一个扰动效果,如火焰扭曲空气,和水波对水底的影响. 1. 在shader 中我们需要一张当前渲染的纹理 2. 给一个物体渲染并使用当前纹理,用屏幕 ...

  8. Unity Shader透明效果

    在实时渲染中要实现透明效果,通常会在渲染模型时控制他的透明通道.当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性--透明度.当透明度为1时表示该像素是完全 ...

  9. Unity Shader 贴花效果(一)

    本文实现的是一个Mesh Decal方法的贴花方案,参考了本篇博文链接: unity的贴花方案.链接的文章是转载的,我并没有找到原文地址.本篇文章主要是学习和自己的理解为主. 先看未贴花之前的效果 这 ...

最新文章

  1. java项目校内网的描述_[导入]校内网的错误信息
  2. 如何创建和维护你自己的man手册
  3. go 捕获网卡http_接口测试工具Postman(三)使用postman抓包捕获HTTP请求-Go语言中文社区...
  4. 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
  5. Centos5.11 使用yum源
  6. 借助模糊测试 深耕细作你的压力测试
  7. 微服务实战之Prometheus使用分享
  8. VirtualBox安装Windows 98步骤
  9. ios 请在设置中打开相机权限_ios开发相机权限问题
  10. 刚学会的画丝滑的箭头ppt
  11. 怎么查ip地址 多种方法教学
  12. STM32定时器的定时时间设置
  13. 手机怎么设置企业邮箱的服务器,如何在手机上设置网易企业邮箱
  14. 服务器维护首先查看指示灯,HP ILO2 使用详细教程[图文]
  15. Kubernates(k8s)工作负载之工作负载资源
  16. Mac安装软件时各种异常情况的解决方法
  17. 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限
  18. MFC picture控件加载透明png图片
  19. win10怎么把锁屏界面变成壁纸
  20. 【SQLserver】使用openrowset方法导入EXCEL表格数据

热门文章

  1. 高性能零售IT系统的建设04-APM全链路建设精讲
  2. 【C4D】DNA螺旋
  3. 向日葵linux远程很卡,血泪经验分享!一个小东西搞定内网财务主机的远程运维...
  4. word导出数据(tp5)
  5. 人生本来极短,像流星刬过天空一样
  6. 洛谷P2790 ccj与zrz之积木问题 题解
  7. iOS 开发的资源整理
  8. 间歇性宏图大志,持续性混吃等死...
  9. 帝国搜索模板不支持php,解决帝国CMS搜索模板不支持灵动标签的方法
  10. Node.js聊天室