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

UnityShader使用速度映射圖實現運動模糊

 更新時間:2019年02月23日 13:50:41   作者:啦啦啦小聰聰  
這篇文章主要為大家詳細介紹了UnityShader使用速度映射圖實現運動模糊,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

原理:

像素的當前幀的NDC坐標(x,y值由uv映射而來,z值由深度值映射而來)——(使用_CurrentViewProjectionInverseMartix變換,并除以w分量)—— 像素的世界坐標 ——(使用_PreviousViewProjectionMatrix變換,并除以w分量)—— 像素的前一幀的NDC坐標 —— (當前幀NDC-前一幀NDC)—— 速度

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 MotionBlurWithDepthTexture : PostEffectsBase
{
 public Shader MotionBlurShader;
 private Material _motionBlurMaterial = null;
 
 public Material Material
 {
 get
 {
  _motionBlurMaterial = CheckShaderAndCreateMaterial(MotionBlurShader, _motionBlurMaterial);
  return _motionBlurMaterial;
 }
 }
 
 //定義運動模糊時模糊圖像使用的大小
 [Range(0.0f, 1.0f)] public float BlurSize = 0.5f;
 //定義一個Camera變量,獲取該腳本所在的攝像機組建,得到攝像機的視角和投影矩陣
 private Camera _myCamera;
 
 public Camera Camera
 {
 get
 {
  if (_myCamera == null)
  {
  _myCamera = GetComponent<Camera>();
  }
  return _myCamera;
 }
 }
 
 //定義一個變量保存 上一幀攝像機的視角 * 投影矩陣
 private Matrix4x4 _previousViewProjectionMatrix;
 
 //在OnEnable中設置攝像機的狀態(tài),以獲得深度紋理
 void OnEnable()
 {
 Camera.depthTextureMode = DepthTextureMode.Depth;
 }
 
 void OnRenderImage(RenderTexture src, RenderTexture dest)
 {
 if (Material != null)
 {
  //將模糊大小傳給Shader
  Material.SetFloat("_BlurSize", BlurSize);
 
  //使用 視角 * 投影矩陣 對NDC(歸一化的設備坐標)下的頂點坐標進行變換,得到該像素在世界空間下的位置
  //計算前一幀與當前幀的位置差,生成該像素的速度
 
  //將 前一幀視角 * 投影矩陣 傳給Shader
  Material.SetMatrix("_PreviousViewProjectionMatrix", _previousViewProjectionMatrix);
  //計算 當前幀視角 * 投影矩陣
  //Camera.projectionMatrix獲得當前攝像機投影矩陣
  //Camera.worldToCameraMatrix獲得當前攝像機視角矩陣
  Matrix4x4 currentViewProjectionMartix = Camera.projectionMatrix * Camera.worldToCameraMatrix;
  //計算 當前幀視角 * 投影矩陣 的逆矩陣
  Matrix4x4 currentViewProjectionInverseMartix = currentViewProjectionMartix.inverse;
  //將當前幀視角 * 投影矩陣 的逆矩陣 傳遞給Shader
  Material.SetMatrix("_CurrentViewProjectionInverseMartix", currentViewProjectionInverseMartix);
  //將 當前幀視角 * 投影矩陣 保存為 前一幀視角 * 投影矩陣
  _previousViewProjectionMatrix = currentViewProjectionMartix;
 
  Graphics.Blit(src, dest, Material);
 }
 else
 {
  Graphics.Blit(src, dest);
 }
 }
}

3.此Shader賦值給代碼2

Shader "Unity Shaders Book/Chapter 13/MotionBlurWithDepthTexture"
{
 Properties
 {
 _MainTex ("Base (RGB)", 2D) = "white" {}
 //模糊圖像時使用的參數
 _BlurSize ("Blur Size", Float) = 1.0
 
 //這里并沒有聲明_PreviousViewProjectionMatrix和_CurrentViewProjectionInverseMartix
 //是因為Unity并沒有提供矩陣類型的屬性,但仍然可以在CG代碼塊中定義這些矩陣,并從腳本中設置它們
 }
 SubShader
 {
 CGINCLUDE
 #include "UnityCG.cginc"
 
 sampler2D _MainTex;
 //使用_MainTex_TexelSize變量來對深度紋理的采樣坐標進行平臺化差異處理
 half4 _MainTex_TexelSize;
 //Unity傳遞來的深度紋理
 sampler2D _CameraDepthTexture;
 //聲明_PreviousViewProjectionMatrix和_CurrentViewProjectionInverseMartix
 float4x4 _PreviousViewProjectionMatrix;
 float4x4 _CurrentViewProjectionInverseMartix;
 half _BlurSize;
 
 //定義頂點著色器
 struct v2f {
 float4 pos : SV_POSITION;
 half2 uv : TEXCOORD0;
 //添加了用于深度紋理采樣的紋理坐標變量
 half2 uv_depth : TEXCOORD1;
 };
 
 v2f vert(appdata_img v) {
 v2f o;
 o.pos = UnityObjectToClipPos(v.vertex);
 o.uv = v.texcoord;
 o.uv_depth = v.texcoord;
 
 //平臺差異化處理
 #if UNITY_UV_STARTS_AT_TOP
 if (_MainTex_TexelSize.y < 0) {
 o.uv_depth.y = 1 - o.uv_depth.y;
 }
 #endif
 
 return o;
 }
 
 //定義片元著色器
 fixed4 frag(v2f i) : SV_Target{
 //使用宏和紋理坐標對深度紋理進行采樣,得到深度值
 float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth);
 
 //構建當前像素的NDC坐標,xy坐標由像素的紋理坐標映射而來,z坐標由深度值d映射而來
 float4 H = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, d * 2 - 1, 1);
 //使用 當前幀的視角 * 投影矩陣 的逆矩陣 對H進行變換
 float4 D = mul(_CurrentViewProjectionInverseMartix, H);
 //把結果除以它的w分量,得到該像素世界空間下的坐標
 float4 worldPos = D / D.w;
 
 //像素當前幀NDC坐標
 float4 currentPos = H;
 
 //使用 前一幀視角 * 投影矩陣 變換世界空間的的坐標worldPos,并除以它的w分量,得到前一幀的NDC坐標
 float4 previousPos = mul(_PreviousViewProjectionMatrix, worldPos);
 previousPos /= previousPos.w;
 
 //計算當前幀與前一幀在屏幕空間下的位置差,得到該像素的速度
 float2 velocity = (currentPos.xy - previousPos.xy) / 2.0f;
 
 //使用速度值對鄰域像素進行采樣,相加后取平均值得到一個模糊效果,使用_BlurSize控制采樣距離
 float2 uv = i.uv;
 float4 c = tex2D(_MainTex, uv);
 uv += velocity * _BlurSize;
 for (int it = 1; it < 3; it++, uv += velocity * _BlurSize) {
 float4 currentColor = tex2D(_MainTex, uv);
 c += currentColor;
 }
 c /= 3;
 
 return fixed4(c.rgb, 1.0);
 }
 ENDCG
 
 Pass
 {
 ZTest Always Cull Off ZWrite Off
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag 
 ENDCG
 }
 }
 Fallback Off
}


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

相關文章

  • C#編程自學之運算符和表達式

    C#編程自學之運算符和表達式

    這篇文章主要介紹了C#運算符和表達式,這是自學C#編程的第五篇,希望對大家的學習有所幫助。
    2015-10-10
  • C#中創(chuàng)建統(tǒng)一API接口的實現方案

    C#中創(chuàng)建統(tǒng)一API接口的實現方案

    在 C# 中創(chuàng)建統(tǒng)一 API 接口需要從架構設計、技術選型和代碼實現等多個層面進行規(guī)劃,本文給大家詳細介紹了實現方案和完整示例代碼,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2025-04-04
  • 二叉樹的遍歷算法(詳細示例分析)

    二叉樹的遍歷算法(詳細示例分析)

    以下代碼是對二叉樹的遍歷算法進行了分析介紹,需要的朋友可以參考下
    2013-05-05
  • WPF實現曲線數據展示

    WPF實現曲線數據展示

    這篇文章將以動數據分析為例為大家詳細介紹wpf實現曲線數據展示與函數曲線展示的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2024-12-12
  • C#使用NUnit進行單元測試詳解

    C#使用NUnit進行單元測試詳解

    NUnit是一個開源的.Net單元測試框架,經常被用來在.Net體系下做白盒測試,本文主要為大家詳細介紹了如何C#如何使用NUnit進行單元測試,感興趣的可以了解下
    2023-12-12
  • 使用C# 的webBrowser寫模擬器時的javascript腳本調用問題

    使用C# 的webBrowser寫模擬器時的javascript腳本調用問題

    這篇文章主要介紹了C# 的webBrowser寫模擬器時的javascript腳本調用問題,需要的朋友可以參考下
    2017-07-07
  • C#使用channel實現Plc異步任務之間的通信

    C#使用channel實現Plc異步任務之間的通信

    在C#的并發(fā)編程中,Channel是一種非常強大的數據結構,用于在生產者和消費者之間進行通信,本文將給大家介紹C#使用channel實現Plc異步任務之間的通信,文中有相關的代碼示例供大家參考,感興趣的朋友跟著小編一起來看看吧
    2024-05-05
  • C#如何檢測操作系統(tǒng)版本

    C#如何檢測操作系統(tǒng)版本

    這篇文章主要為大家詳細介紹了C#如何檢測操作系統(tǒng)版本的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C#執(zhí)行DOS命令的方法

    C#執(zhí)行DOS命令的方法

    這篇文章主要介紹了C#執(zhí)行DOS命令的方法,涉及針對進程的調用以及系統(tǒng)DOS命令的使用,具有不錯的實用價值,需要的朋友可以參考下
    2014-11-11
  • C#算法之回文數

    C#算法之回文數

    這篇文章介紹了C#算法之回文數,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論

苍溪县| 河间市| 靖西县| 海林市| 营口市| 丰台区| 陕西省| 大冶市| 富阳市| 石柱| 教育| 波密县| 富裕县| 武胜县| 额济纳旗| 浦东新区| 都江堰市| 金乡县| 北票市| 金塔县| 屏南县| 名山县| 博罗县| 吴旗县| 清徐县| 苏州市| 邵武市| 自贡市| 油尖旺区| 金门县| 垣曲县| 平遥县| 四子王旗| 寻乌县| 清水河县| 嵊泗县| 中牟县| 江永县| 永兴县| 武威市| 永顺县|