3.4 屏幕后处理(4) - 预备知识

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

在这里插入图片描述
在这里插入图片描述

学习 Python 并不需要非常深厚的前置知识,但掌握一些基础概念可以显著降低入门的难度,并为后续的深入学习打下坚实的基础。 ### 3.1 计算机基础知识 了解计算机的基本组成和运行原理会对学习编程有所帮助。例如,理解操作系统的基本操作、文件系统结构、命令行界面等概念,可以让你更高效地使用开发工具和调试程序。此外,熟悉基本的网络概念也有助于后续进行 Web 开发或网络爬虫等方向的学习。 ### 3.2 基本数学知识 虽然 Python 编程并不总是需要复杂的数学知识,但在某些应用场景中,如数据分析、机器学习、图像处理等,掌握一些基础数学概念(如线性代数、统计学、微积分)会带来很大帮助。例如,在使用 NumPy 或 Pandas 进行数据处理时,理解数组运算和矩阵操作可以提高代码效率。 ### 3.3 逻辑思维能力 编程本质上是解决问题的过程,因此良好的逻辑思维能力是必不可少的。能够将复杂问题分解为多个小问题,并设计清晰的解决方案,是编写高质量 Python 程序的关键能力之一。 ### 3.4 基本编程概念 尽管 Python 是一门非常适合初学者的语言,但对一些基本编程概念的了解可以加快学习进度。例如: - **变量与数据类型**:理解变量的定义和使用,以及常见的数据类型如整数、浮点数、字符串、布尔值等。 - **控制结构**:掌握条件语句(如 `if-else`)、循环结构(如 `for` 和 `while`)等基本流程控制方式。 - **函数**:理解如何定义和调用函数,以及函数参数和返回值的使用。 - **模块与包**:了解如何导入和使用 Python 的标准库和第三方库。 掌握这些基础概念后,可以更轻松地学习 Python 的高级特性,如面向对象编程、异常处理、文件操作等。 ### 3.5 实践与项目经验 学习 Python 不应仅停留在理论层面,实际动手编写代码是掌握技能的关键。可以通过完成小型项目来巩固所学知识,例如: ```python # 示例:一个简单的计算器 def add(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def divide(a, b): if b == 0: return "除数不能为零" return a / b # 使用示例 result = divide(10, 2) print("结果是:", result) ``` 通过不断实践,可以逐步提升编程能力,并根据兴趣方向选择深入学习的领域,如 Web 开发、数据分析、自动化脚本、人工智能等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值