1.屏幕后期处理效果简介
2.常用方法
3.屏幕后处理基类
4.Shader渲染状态
1.屏幕后期处理效果简介
屏幕后处理表示渲染完毕整个场景得到屏幕图像后, 对屏幕图像进行额外的处理

a.src表示源纹理, 通常是当前屏幕的渲染纹理或是上一步处理后得到的渲染纹理
src纹理将会传递给Shader中名为_MainTex的纹理属性
b.dest是目标渲染纹理
c.mat是使用的材质, 这个材质使用的Shader进行各种屏幕后处理操作
d.pass的默认值是-1, 表示将会依次调用Shader内的所有Pass; 否则只会调用给定索引的Pass


2.常用方法
a.shader.isSupported
判断shader在目标平台和硬件上是否能够正确运行; 如果返回false, 不支持, true表示支持
b.[ExcuteInEditMode]表示脚本在编辑器模式也能运行
c.[RequireComponent(typeof(组件))]
指定某个脚本所依赖的组件, 它确保将脚本添加到游戏对象上, 所需的组件也会自动添加到游戏对象中
后处理脚本一般添加到相机上, 因此需要依赖相机组件
d.HideFlags.DontSave表示对象不能保存到当前的场景, 切换新的场景时该对象不会自动被移除
3.屏幕后处理基类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour
{
// 屏幕后处理效果会使用的Shader
public Shader shader;
// 一个用于动态创建出来的材质球 就不用再工程中手动创建了
private Material _material;
// 处理屏幕图像
protected virtual void OnRenderImage(RenderTexture source, RenderTexture destination)
{
// 判断这个材质球是否为空 如果不为空 就证明这个shader能用来处理屏幕后处理效果
if (material != null)
Graphics.Blit(source, destination, material);
else // 如果为空 就不用处理后处理效果了 直接显示原画面就可以了
Graphics.Blit(source, destination);
}
protected Material material
{
get
{
// 如果shader没有或者有但是不支持当前平台
if (shader == null || !shader.isSupported)
return null;
else
{
// 避免每次调用属性都去new材质球
// 如果之前new过了,并且shader也没有变化
// 那就不用new了 直接返回使用即可
if (_material != null && _material.shader == shader)
return _material;
// 除非材质球是空的 或者shader变化了 才会走下面的逻辑
// 用支持的shader动态创建一个材质球 用于渲染
_material = new Material(shader);
// 新的场景中保留该对象和所有组件
_material.hideFlags = HideFlags.DontSave;
return _material;
}
}
}
}
4.Shader渲染状态
1).Cull Off(关闭背面剔除)
后处理通常是在一个覆盖整个屏幕的四边形(两个三角形)上绘制; 默认情况下, Unity会剔除背面(即从摄像机方向看, 四边形
的背面不会被绘制); 但如果我们不小心将四边形背对摄像机, 则会导致后处理效果不被渲染; 关闭背面剔除(Cull Off)确保
无论四边形如何放置, 其正面和背面都会被绘制, 避免因背面剔除导致后处理失效
2).ZTest Always(深度测试总是通过)
希望后处理效果绘制到屏幕中的每一个像素, 无论当前深度缓冲区中的值是什么

3).ZWrite Off


357

被折叠的 条评论
为什么被折叠?



