unity shader景深效果
实现效果
景深效果
实现思路
由两张图组成,分别是远处的模糊状态和近处的清晰状态,根据物体的深度判断物体离摄像机的距离确定物体的状态。两个图进行插值,越近越靠近清晰的图像。
代码
脚本代码:
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景深效果相关推荐
- 用Unity实现景深效果
用Unity实现景深效果 景深也是一种非常常见的后处理手段,它用来模拟相机拍摄画面的效果.今天我们讨论如何在Unity中实现它. 简单来说,景深效果可以拆分为两个部分,一个部分是聚焦,使画面中指定的区 ...
- [Unity Shader]凌波微步效果
[Unity Shader]凌波微步效果 相信很多人都看过天龙八部,里面的段誉有一个技能就是凌波微步:移动的时候人先到,衣角跟随其后.说白了就是移动时有一个残影跟着他.下面先看下最终效果 下面我们看如 ...
- Unity Shader 动画效果出现残影
问题 复现<Unity Shader入门精要>的动画效果时,我发现我的动画都出现了残影. 一开始认为是程序写错了,采样出现了问题,但是复查对比其他资料很多遍也没发现错误. 解决方法 后来反 ...
- Unity Shader - 描边效果
原文链接:http://blog.csdn.net/puppet_master/article/details/54000951 简介 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个 ...
- Unity Shader放大镜效果
小菜最近看到了一篇关于Shader实现的放大镜效果,酷炫的效果让小菜倍生好奇,冲动之下还是搬来练练手,刚好巩固下自己的顶点片元着色器编码. 有没有想学习的冲动!!! 文章的开始先来介绍一款好用的vs编 ...
- Unity Shader 新手引导效果
这两天实现了下新手引导需要的遮罩镂空shader效果,记录一下. 1.圆形镂空shader代码: //计算片元世界坐标和目标中心位置的距离 float dis = distance(IN.worldP ...
- unity Shader 扭曲效果
原理 所谓扭曲就是扰动一个物体的uv坐标,表现出来就是一个扰动效果,如火焰扭曲空气,和水波对水底的影响. 1. 在shader 中我们需要一张当前渲染的纹理 2. 给一个物体渲染并使用当前纹理,用屏幕 ...
- Unity Shader透明效果
在实时渲染中要实现透明效果,通常会在渲染模型时控制他的透明通道.当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性--透明度.当透明度为1时表示该像素是完全 ...
- Unity Shader 贴花效果(一)
本文实现的是一个Mesh Decal方法的贴花方案,参考了本篇博文链接: unity的贴花方案.链接的文章是转载的,我并没有找到原文地址.本篇文章主要是学习和自己的理解为主. 先看未贴花之前的效果 这 ...
最新文章
- java项目校内网的描述_[导入]校内网的错误信息
- 如何创建和维护你自己的man手册
- go 捕获网卡http_接口测试工具Postman(三)使用postman抓包捕获HTTP请求-Go语言中文社区...
- 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
- Centos5.11 使用yum源
- 借助模糊测试 深耕细作你的压力测试
- 微服务实战之Prometheus使用分享
- VirtualBox安装Windows 98步骤
- ios 请在设置中打开相机权限_ios开发相机权限问题
- 刚学会的画丝滑的箭头ppt
- 怎么查ip地址 多种方法教学
- STM32定时器的定时时间设置
- 手机怎么设置企业邮箱的服务器,如何在手机上设置网易企业邮箱
- 服务器维护首先查看指示灯,HP ILO2 使用详细教程[图文]
- Kubernates(k8s)工作负载之工作负载资源
- Mac安装软件时各种异常情况的解决方法
- 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限
- MFC picture控件加载透明png图片
- win10怎么把锁屏界面变成壁纸
- 【SQLserver】使用openrowset方法导入EXCEL表格数据