纳金网

标题: Unity 简易战争迷雾 [打印本页]

作者: may    时间: 2018-12-31 19:11
标题: Unity 简易战争迷雾

来自: 随幻Kaller

记载一下之前看过的视频中 简易战争迷雾的关键代码主要流程:两个摄像机 一个显示主画面 一个显示可见区域
利用 RenderTexture 可进行对可见区域的渲染

主摄像机挂 WarFog 脚本
然后 MaskMat 材质换成下面的 Shader
  1. using UnityEngine;
  2. public class WarFog : MonoBehaviour
  3. {

  4.     [SerializeField]
  5.     //拖到子摄像机上的Render Texture  
  6.     private RenderTexture mask;

  7.     [SerializeField]
  8.     //创建的材质球   需要用到WarFog sharder  在下面给出  
  9.     private Material mat;
  10.     //在图像渲染之后执行  
  11.     public void OnRenderImage(RenderTexture source, RenderTexture des)
  12.     {
  13.         //将遮罩的mask传入材质球  
  14.         mat.SetTexture("_MaskTex", mask);
  15.         //经过材质球的sharder变换后  拷贝源纹理到目的渲染纹理。  
  16.         Graphics.Blit(source, des, mat);
  17.     }
  18. }
复制代码
shader:
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

  2. Shader "Custom/WarFog" {
  3.         Properties{
  4.                 _MainTex("_MainTex", 2D) = "white" {}
  5.         //遮罩纹理     
  6.         _MaskTex("_MaskTex", 2D) = "white" {}
  7.         }
  8.                 SubShader{
  9.                 Pass{
  10.                 CGPROGRAM
  11.                 //顶点处理器  
  12. #pragma vertex m_vert_img   
  13.                 //片段处理器  
  14. #pragma fragment frag   

  15. #include "UnityCG.cginc"   

  16.                 uniform sampler2D _MainTex;
  17.         uniform sampler2D _MaskTex;

  18.         struct m_appdata_img {
  19.                 float4 vertex : POSITION;
  20.                 half2 texcoord : TEXCOORD0;
  21.                 half2 texcoord1 : TEXCOORD1;
  22.         };
  23.         struct m_v2f_img {
  24.                 float4 pos : SV_POSITION;
  25.                 half2 uv : TEXCOORD0;
  26.                 half2 uv1 : TEXCOORD1;
  27.         };
  28.         //像素处理器  
  29.         fixed4 frag(m_v2f_img i) : COLOR
  30.         {
  31.                 //主纹理  
  32.                 fixed4 renderTex = tex2D(_MainTex, i.uv);
  33.         //遮罩纹理  
  34.         fixed4 renderTex1 = tex2D(_MaskTex, i.uv1);
  35.         fixed4 finalColor;
  36.         //如果遮罩的红色通道小于0.3  最终颜色就是遮罩图片   否则为主图片  
  37.         if (renderTex1.r < .3) {
  38.                 finalColor = renderTex1.rgba;
  39.         }
  40.         else {
  41.                 finalColor = renderTex.rgba;
  42.         }

  43.         return finalColor;
  44.         }
  45.                 //调整UV值   实现正常偏转  
  46.                 float2 m_MultiplyUV(float4x4 mat, float2 inUV) {
  47.                 float4 temp = float4 (inUV.x, inUV.y, 0, 0);
  48.                 temp = mul(mat, temp);
  49.                 return temp.xy;
  50.         }


  51.         m_v2f_img m_vert_img(m_appdata_img v)
  52.         {
  53.                 m_v2f_img o;
  54.                 o.pos = UnityObjectToClipPos(v.vertex);
  55.                 o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord);
  56.                 o.uv1 = m_MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord1);
  57.                 return o;
  58.         }
  59.         ENDCG
  60.         }
  61.         }
  62.                 FallBack "Diffuse"
  63. }
复制代码





欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5