最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

UnityShader使用圖像疊加實現(xiàn)運動模糊

 更新時間:2019年02月23日 12:41:18   作者:啦啦啦小聰聰  
這篇文章主要為大家詳細介紹了UnityShader使用圖像疊加實現(xiàn)運動模糊,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了UnityShader實現(xiàn)運動模糊的具體代碼,供大家參考,具體內(nèi)容如下

1.此代碼掛在攝像機上,使攝像機運動起來

using UnityEngine;
using System.Collections;
 
public class Translating : MonoBehaviour {
 
 public float speed = 10.0f;
 public Vector3 startPoint = Vector3.zero;
 public Vector3 endPoint = Vector3.zero;
 public Vector3 lookAt = Vector3.zero;
 public bool pingpong = true;
 
 private Vector3 curEndPoint = Vector3.zero;
 
 // Use this for initialization
 void Start () {
 transform.position = startPoint;
 curEndPoint = endPoint;
 }
 
 // Update is called once per frame
 void Update () {
 transform.position = Vector3.Slerp(transform.position, curEndPoint, Time.deltaTime * speed);
 transform.LookAt(lookAt);
 if (pingpong) {
 if (Vector3.Distance(transform.position, curEndPoint) < 0.001f) {
 curEndPoint = Vector3.Distance(curEndPoint, endPoint) < Vector3.Distance(curEndPoint, startPoint) ? startPoint : endPoint;
 }
 }
 }
}

2.此代碼掛在攝像機上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MotionBlur : PostEffectsBase
{
 
 public Shader MotionBlurShader;
 private Material _motionBlurMaterial = null;
 
 public Material Material
 {
  get
  {
   _motionBlurMaterial = CheckShaderAndCreateMaterial(MotionBlurShader, _motionBlurMaterial);
   return _motionBlurMaterial;
  }
 } 
 
 //定義運動模糊在混合圖像時使用的模糊參數(shù),值越大,拖尾越明顯,但過大會完全替代當前幀的渲染結(jié)果,所以最大為0.9
 [Range(0.0f, 0.9f)] public float BlurAmount = 0.5f;
 
 //定義一個RenderTexture類型的變量,保存之前圖像疊加的結(jié)果
 private RenderTexture _accumulationTexture;
 //當腳本不運行時,立即銷毀,這樣在下一次開始運行時會重新疊加圖像
 void OnDisable()
 {
  DestroyImmediate(_accumulationTexture);
 }
 
 void OnRenderImage(RenderTexture src, RenderTexture dest)
 {
  if (Material != null)
  {
   //判斷用于混合圖像的_accumulationTexture是否為空,或者是否與當前屏幕分辨率相等
   //如果不滿足,需要重新創(chuàng)建
   if (_accumulationTexture == null || _accumulationTexture.width != src.width ||
    _accumulationTexture.height != src.height)
   {
    //立即銷毀當前_accumulationTexture
    DestroyImmediate(_accumulationTexture);
    //創(chuàng)建一個與當前屏幕分辨率相等的
    _accumulationTexture = new RenderTexture(src.width, src.height, 0);
    //由于我們自己控制這個變量的銷毀,所以不需要他顯示在Hierarchy中,也不需要保存在場景中
    _accumulationTexture.hideFlags = HideFlags.HideAndDontSave;
    //使用當前的幀圖像初始化_accumulationTexture
    Graphics.Blit(src, _accumulationTexture);
   }
 
   //對渲染紋理進行恢復操作,發(fā)生在渲染的紋理而該紋理又沒有被提前清空或銷毀的情況下
   //運動模糊每次調(diào)用OnRenderImage函數(shù),都需要把當前紋理與_accumulationTexture中的圖像混合,所以_accumulationTexture不需要被提前清空
   _accumulationTexture.MarkRestoreExpected();
 
   //將參數(shù)傳給材質(zhì)
   Material.SetFloat("_BlurAmount", 1.0f - BlurAmount);
 
   //把當前的屏幕圖像疊加到_accumulationTexture
   Graphics.Blit(src, _accumulationTexture, Material);
   //把疊加后的圖像輸出到屏幕
   Graphics.Blit(_accumulationTexture, dest);
  }
  else
  {
   Graphics.Blit(src, dest);
  }
 }
}

3.此Shader賦值給代碼2

Shader "Unity Shaders Book/Chapter 12/MotionBlur"
{
 Properties
 {
 _MainTex ("Base (RGB)", 2D) = "white" {}
  //混合系數(shù)
 _BlurAmount("Blur Amount", Float) = 1.0
 }
 SubShader
 {
 CGINCLUDE
 #include "UnityCG.cginc"
 
 sampler2D _MainTex;
 fixed _BlurAmount;
 
 //定義頂點著色器
 struct v2f {
 float4 pos : SV_POSITION;
 half2 uv : TEXCOORD0;
 };
 
 v2f vert(appdata_img v) {
 v2f o;
 o.pos = UnityObjectToClipPos(v.vertex);
 o.uv = v.texcoord;
 return o;
 }
 
 //定義第一個片元著色器,用于更新渲染紋理的RGB通道部分
 fixed4 fragRGB(v2f i) : SV_Target{
 //將A通道的值設(shè)為_BlurAmount,這樣在后面混合時可直接使用透明通道進行混合
 return fixed4(tex2D(_MainTex, i.uv).rgb, _BlurAmount);
 }
 
 //定義第二個片元著色器,用于更新渲染紋理的A通道部分
 half4 fragA(v2f i) : SV_Target{
 //直接返回采樣結(jié)果,為了維護渲染紋理的透明通道值,不讓其受到混合時使用的透明度值的影響
 return tex2D(_MainTex, i.uv);
 }
 
 ENDCG
 
 ZTest Always Cull Off Zwrite Off
 //第一個Pass,用于更新渲染紋理的RGB通道
 Pass
 {
 Blend SrcAlpha OneMinusSrcAlpha
 ColorMask RGB
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment fragRGB
 ENDCG
 }
 
 //第二個Pass,用于更新渲染紋理的A通道
 Pass
 {
 Blend One Zero
 ColorMask A
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment fragA
 ENDCG
 }
 }
 Fallback Off
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#不提升自己程序的權(quán)限實現(xiàn)操作注冊表

    C#不提升自己程序的權(quán)限實現(xiàn)操作注冊表

    這篇文章主要介紹了C#不提升自己程序的權(quán)限實現(xiàn)操作注冊表的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C#繪制實時曲線圖的方法詳解

    C#繪制實時曲線圖的方法詳解

    這篇文章主要為大家詳細介紹了如何利用C#繪制實時曲線圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#創(chuàng)建控制Windows服務(wù)

    C#創(chuàng)建控制Windows服務(wù)

    這篇文章介紹了C#創(chuàng)建和控制Windows服務(wù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#讀取QQ純真IP數(shù)據(jù)庫QQWry.Dat的代碼

    C#讀取QQ純真IP數(shù)據(jù)庫QQWry.Dat的代碼

    QQ純真IP庫算是IP地址收集較為全的一個IP庫,對于IP查詢來說這個是不錯的選擇。下面是如何查詢純真IP庫的一個類,使用C#代碼。
    2007-03-03
  • C# WPF自制簡單的批注工具

    C# WPF自制簡單的批注工具

    在教學和演示中,我們通常需要對重點進行批注,下載安裝第三方工具批注顯得很麻煩,本文將使用WPF開發(fā)了一個批注工具,感興趣的可以了解下
    2024-11-11
  • C#多線程編程詳解

    C#多線程編程詳解

    C#提供了豐富的多線程操作,為編程帶來了極大的便利,但如果使用不當也會帶來各種各樣的麻煩。本篇文章主要介紹了C#多線程,有需要的可以了解一下。
    2016-11-11
  • C#中Mutex對象用法分析

    C#中Mutex對象用法分析

    這篇文章主要介紹了C#中Mutex對象用法,結(jié)合實例形式分析了Mutex對象的功能與線程操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C# 文件拖拽和pixturBox縮放與拖拽功能

    C# 文件拖拽和pixturBox縮放與拖拽功能

    這篇文章主要介紹了C# 文件拖拽和pixturBox縮放與拖拽功能,代碼簡單易懂,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • WPF實現(xiàn)頁面的切換的示例代碼

    WPF實現(xiàn)頁面的切換的示例代碼

    本文主要介紹了WPF實現(xiàn)頁面的切換的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • C#利用ZXing.Net生成條形碼和二維碼

    C#利用ZXing.Net生成條形碼和二維碼

    這篇文章主要為大家詳細介紹了C#利用ZXing.Net生成條形碼和二維碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

龙胜| 同江市| 灌阳县| 海城市| 资兴市| 蒙自县| 木里| 托克托县| 泰州市| 易门县| 闵行区| 黑河市| 南陵县| 永清县| 论坛| 前郭尔| 潼南县| 凤山县| 西乌| 夏河县| 水富县| 弋阳县| 呼伦贝尔市| 克拉玛依市| 漳浦县| 绥棱县| 息烽县| 娱乐| 高台县| 绥宁县| 交城县| 雅江县| 南岸区| 嘉善县| 礼泉县| 砀山县| 尉氏县| 万山特区| 五家渠市| 出国| 阿坝|