Unity_Shader高级篇_12_Unity Shader入门精要

本文深入探讨Unity Shader的高级应用,包括屏幕后处理效果的实现,如亮度、饱和度和对比度调整,以及使用Sobel算子进行边缘检测的描边效果。介绍了OnRenderImage函数、Graphics.Blit在屏幕特效中的应用,以及如何利用渲染纹理和特殊Shader创建视觉特效。
摘要由CSDN通过智能技术生成

高级篇涵盖了一些Shader的高级用法,例如,如何实现屏幕特效、利用法线和深度缓冲,以及非真实渲染等,同时,我们介绍一些针对移动平台的优化技巧。
第十二章 屏幕后处理效果
这一章将介绍如何在Unity中实现一个基本的屏幕后处理脚本系统,并给出一些基本的屏幕特效的实现团里,如高斯模糊、边缘检测等。
第十三章 使用深度和法线纹理
获取特殊的纹理来实现屏幕特效
第十四章 非真实感渲染
将会给出常见的非真实感渲染的算法,如卡通渲染、素描风格的熏染大概。
第十五章 使用噪音
很多时候噪音是我们实现特效的“救星”。
第十六张 Unity中的渲染优化技术
优化往往是游戏渲染中的重点。

屏幕后处理效果(screen post-processing effects)是游戏中实现屏幕特效常见方法。在本中,我们将学习如何在 Unity中利用渲染纹理来实现各种常见的屏幕后处理效果。在12.1节中,我们首先会解释在Unity中实现屏幕后处理效果的原理,并建立一个基本的屏幕后处理脚本系统。随后在12.2节中,我们会使用这个系统实现一个简单的调整画面亮度、饱和度和对比度的屏幕特效。在12.3节中,我们会接触到图像滤波的概念,并利用Sobel算子在屏幕空间中对图像进行边缘检测,实现描边效果。在此基础上,12.4节将会介绍如何实现一个高斯模糊的屏幕特效。在12.5和12.6节中,我们会分别介绍如何实现Bloom和运动模糊效果。

12.1 建立一个基本的屏幕后处理脚本系统
屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。使用这种技术,可以为游戏画面添加更多的艺术效果,例如景深(Depth of Field)、运动模糊(Motion Blur)等。
因此,想要实现屏幕后处理的基础在于得到渲染后的屏幕图像,即抓取屏幕,而Unity为我们提供了这样一个方便的接口——OnRenderImage函数。它的函数声明如下:MonoBehavior.OnrenderImage (RenderTexture src, RenderTexture dest)
当我们在脚本中声明此函数后,Unity会把当前渲染得到的图像存储在第一个参数对应的源渲染纹理中,通过函数中的一系列操作后,在把目标渲染纹理,即第二个参数对应的渲染纹理显示到屏幕上。在OnRenderImage函数中,我们通常是利用Graphics.Blit函数来完成对渲染纹理的处理。它有三种函数声明:

public static void Blit (Texture src, RenderTexture dest);
public static void Blit (Texture src, RenderTexture dest,Material mat, int pass = -1);
public static void Blit (Texture src, Material mat, int pass = -1);

其中,参数src对应了源文件,在屏幕后处理基础中,这个参数通常就是当前屏幕的渲染纹理或是上一步处理后得到的纹理。参数dest是目标渲染纹理,如果它的值我null就会直接将结果显示在屏幕上。参数mat是我们使用的材质,这个材质使用的Unity Shader将会进行各种屏幕后处理操作,而src纹理将会被传递给Shader中名为_MainTex的纹理属性。参数pass的默认值为-1,表示将会依次调用Shader内的所有Pass。否则,只会调用给定索引的Pass。
在默认情况下,OnRenderImage函数会在所有的不透明和透明的Pass执行完毕后被调用,以便对场景中所有游戏对象都产生影响。但有时,我们希望在不透明的Pass(即渲染队列小于等于2500的Pass,内置的Background、Geometry和AlphaTest渲染队列均在此范围内)执行完毕后立即调用OnRenderImage函数,从而不对透明物体产生任何影响。此时,我们可以在OnRenderImage函数前添加ImageEffectOpaque属性来实现这样的目的。13.4节展示了这样一个例子,在13.4节中,我们会利用深度和法线纹理进行边缘检测从而实现描边的效果,但我们不希望透明物体也被描边。
因此,要在Unity中实现屏幕后处理效果,过程通常如下:我们首先需要在摄像机中添加一个用于屏幕后处理的脚本。这个脚本中,我们会实现OnRenderImage函数来获取当前屏幕的渲染纹理。然后,在调用Graphics.Blit函数使用特殊的Unity Shadr来对当前屏幕的渲染纹理。然后,再调用Graphics.Bit函数使用特定的Unity Shader来对当前图像进行处理,再把返回的渲染纹理显示到屏幕上。对于一些复杂的屏幕特效,我们可能需要多次调用Graphics.Cilt函数来对上一步的输出结果进行下一步处理。
但是,在进行屏幕后处理之前,我们需要检查一系列条件是否满足,例如当前平台是否支持渲染纹理和屏幕特效是时,是否支持当前使用的Unity Shaader等。为此,我们创建了一个用于屏幕后处理效果的基类,在实现各种屏幕特效时,我们只需要继承该自该基类,再实现派生类中不同的操纵即可。

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
//首先,所有屏幕后处理效果都需要绑定在摸个摄像机上,并且我们希望在编辑状态下,
//也可以执行该脚本
public class PostEffectsBase : MonoBehaviour {

    // 开始时调用
    protected void CheckResources() {
        bool isSupported = CheckSupport();

        if (isSupported == false) {
            NotSupported();
        }
    }
    //为了提前检查各种资源和条件是否满足,我们在Start函数中调用CheckResources函数

    // 调用CheckResources检查这个平台上的支持
    protected bool CheckSupport() {
        if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false) {
            Debug.LogWarning("This platform does not support image effects or render textures.");
            return false;
        }

        return true;
    }

    // Called when the platform doesn't support this effect
    protected void NotSupported() {
        enabled = false;
    }

    protected void <
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值