unity shader景深效果

news/2024/12/29 10:33:35/

实现效果

景深效果

实现思路

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

代码

脚本代码:

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"
}

http://www.ppmy.cn/news/945520.html

相关文章

RabbitMQ的应用场景

1.异步处理 消息队列的主要特点是异步处理&#xff0c;主要目的是减少请求响应时间&#xff0c;实现非核心流程异步化&#xff0c;提高系统响应性能。 所以典型的使用场景就是将比较耗时而且不需要即时&#xff08;同步&#xff09;返回结果的操作&#xff0c;作为消息放入消息…

Unity 景深Depth Of Field

目录 介绍 准备 设置 基于Unity Builtin 管线 基于Unity URP 基于Unity HDRP 介绍&#xff1a; 景深效果Depth Of Field是摄影界的老常客了&#xff0c;在游戏中也非常多见&#xff0c;它能够大幅提升游戏画面体验和真实度&#xff0c;使得物体看起来更有细节。 GTA5中的…

第一讲 构图和景别

文章目录 构图中心点构图水平线构图法对称线构图三分线构图法对角线构图引导线构图法前景构图填充构图留白构图重复构图对比构图 景别参考文献 构图 中心点构图 中心构图是将主体放置在画面中心进行构图。这种构图方式的最大优点就在于主体突出、明确&#xff0c;而且画面容易…

Unity景深效果

Unity景深效果 window packagemanager postprocessing installproject面板右键创建post-processing profile主相机设置layer 比如layerA主相机添加组件 post-process layer 里面设置layer为layerA 主相机添加 post-process volume2创建的文件拖到volume上的 profilevolume 勾选…

用Unity实现景深效果

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

matlab景深合成算法,简单明了讲解景深合成

看到这样的作品&#xff0c;是不是很疑惑摄影师怎么做到呢&#xff0c;镜头几乎贴着前景拍摄了&#xff0c;前后景都能如此清晰&#xff0c;到底是用多小的光圈才能做到啊&#xff1f; 其实&#xff0c;这样的全景深照片&#xff0c;再小的光圈都无法做到&#xff0c;只能用PS放…

dof景深matlab,景深(DOF)

今天偷偷地背着老板去上本科生的计算机视觉课&#xff0c;然后讲的全部都是照相机的物理知识&#xff0c;作为曾经物理的爱好者&#xff0c;自然非常感兴趣&#xff0c;因此也接触了景深这个概念DOF&#xff0c;英文全称是Depth of Field。 本文着重介绍几个概念性质的东西。 焦…

CSS景深效果

什么是景深 图片在近处很模糊&#xff0c;而在其远处显得很清晰 实现景深效果 初始时 使用景深效果 filter: blur(5px);