纳金网
标题:
Unity 简易战争迷雾
[打印本页]
作者:
may
时间:
2018-12-31 19:11
标题:
Unity 简易战争迷雾
来自: 随幻Kaller
记载一下之前看过的视频中 简易战争迷雾的关键代码主要流程:两个摄像机 一个显示主画面 一个显示可见区域
利用 RenderTexture 可进行对可见区域的渲染
主摄像机挂 WarFog 脚本
然后 MaskMat 材质换成下面的 Shader
using UnityEngine;
public class WarFog : MonoBehaviour
{
[SerializeField]
//拖到子摄像机上的Render Texture
private RenderTexture mask;
[SerializeField]
//创建的材质球 需要用到WarFog sharder 在下面给出
private Material mat;
//在图像渲染之后执行
public void OnRenderImage(RenderTexture source, RenderTexture des)
{
//将遮罩的mask传入材质球
mat.SetTexture("_MaskTex", mask);
//经过材质球的sharder变换后 拷贝源纹理到目的渲染纹理。
Graphics.Blit(source, des, mat);
}
}
复制代码
shader:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/WarFog" {
Properties{
_MainTex("_MainTex", 2D) = "white" {}
//遮罩纹理
_MaskTex("_MaskTex", 2D) = "white" {}
}
SubShader{
Pass{
CGPROGRAM
//顶点处理器
#pragma vertex m_vert_img
//片段处理器
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform sampler2D _MaskTex;
struct m_appdata_img {
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
half2 texcoord1 : TEXCOORD1;
};
struct m_v2f_img {
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
half2 uv1 : TEXCOORD1;
};
//像素处理器
fixed4 frag(m_v2f_img i) : COLOR
{
//主纹理
fixed4 renderTex = tex2D(_MainTex, i.uv);
//遮罩纹理
fixed4 renderTex1 = tex2D(_MaskTex, i.uv1);
fixed4 finalColor;
//如果遮罩的红色通道小于0.3 最终颜色就是遮罩图片 否则为主图片
if (renderTex1.r < .3) {
finalColor = renderTex1.rgba;
}
else {
finalColor = renderTex.rgba;
}
return finalColor;
}
//调整UV值 实现正常偏转
float2 m_MultiplyUV(float4x4 mat, float2 inUV) {
float4 temp = float4 (inUV.x, inUV.y, 0, 0);
temp = mul(mat, temp);
return temp.xy;
}
m_v2f_img m_vert_img(m_appdata_img v)
{
m_v2f_img o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord);
o.uv1 = m_MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord1);
return o;
}
ENDCG
}
}
FallBack "Diffuse"
}
复制代码
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5