写在前面的话:
这个雾效大部分代码源自 冯乐乐的书籍:Unity shader 入门精要。
在书中的示例代码中,主要基于了屏幕高度,而对屏幕进行雾效的渲染。我将其中的部分shader代码修改后,实现了基于摄像机距离的雾效渲染。
先解释雾效shader代码的原理:
雾效的实现是基于屏幕后处理,即在摄像机上挂一个脚本,这个脚本中执行OnRenderImage函数,对摄像机所渲染得到的最终图像进行处理,进而表现出屏幕上有雾的效果。
而雾效shader中的处理方式是:先计算出屏幕上每一个像素基于摄像机的线性深度值,然后再通过插值的方式,根据摄像机在世界空间下的实际坐标,大致计算出屏幕上每一个像素的世界坐标。最后再根据像素的坐标,让它和雾的颜色进行一定程度的混合,例如像素越近显示得越清晰,而像素越远则雾的颜色越浓。
以下代码,c#脚本需要挂在场景中的主摄像机上,然后把shader文件拖到脚本对应的变量上就可以看最终效果,代码如下:
c#脚本 :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FogWithDepthTexture : MonoBehaviour{
public Shader fogShader;
private Material fogMaterial = null;
public Material material
{
get
{
//fogMaterial = CheckShaderAndCreateMaterial(fogShader, fogMaterial);
if (fogShader == null)
{
return null;
}
if (fogShader.isSupported && fogMaterial && fogMaterial.shader == fogShader)
return fogMaterial;
if (!fogShader.isSupported)
{
return null;
}
else
{
fogMaterial = new Material(fogShader);
fogMaterial.hideFlags = HideFlags.DontSave;
if (fogMaterial)
return fogMaterial;
else
return null;
}
//return fogMaterial;
}
}
private Camera myCamera;
public Camera camera
{
get
{
if(myCamera =