屏幕后期处理
1、屏幕后期处理效果
屏幕后期处理效果( Screen Post-Processing Effects)是一种在渲染管线的最后阶段应用的视觉效果,允许在场景渲染完成后对最终图像进行各种调整和效果处理,从而增强视觉体验
常见的屏幕后期处理效果有:景深、模糊、色彩调整 等等
2、Unity中 屏幕后期处理效果的 基本实现原理
想要完成屏幕后期处理效果
最关键的问题在于
- 如何获取 游戏画面渲染完毕后的画面信息
- 如何为 获取到的画面信息添加自定义效果
只要搞清楚这两点,自然就明白了基本实现原理
(1)如何获取 游戏画面渲染完毕后的画面信息
在Unity中获取渲染纹理的常用方法有三种:RenderTexture、GrabPass、OnRenderImage
在处理屏幕后期处理效果时会使用OnRenderImage函数来获取 游戏画面渲染完毕后的画面信息
(2)如何为 获取到的画面信息添加自定义效果
主要思路是将获取到的游戏画面作为 自定义Shader的主纹理,通过自定义Shader利用捕获的画面来实现自定义效果
3、捕获画面的关键——OnRenderImage函数
OnRenderImage函数
它是在继承了MonoBehaviour的脚本中能够被自动调用的函数(类似生命周期函数),它会在图像的渲染操作完成后调用
它的固定写法是:
void OnRenderImage(RenderTexture source, RenderTexture destination)
第一个参数:源渲染纹理,当前渲染得到的屏幕图像存储在该参数当中
第二个参数:目标渲染纹理,将经过处理后的图像写入到目标纹理中用于最终的显示
通过该函数我们便可以得到当前渲染的游戏画面,并在该函数中对画面对应的渲染纹理进行处理后用于最终显示
注意:
该函数得到的源纹理默认是在所有的不透明和透明的Pass执行完毕后调用的,基于该源纹理进行修改会对游戏场景中所有游戏对象产生影响,如果你想要在不透明的Pass执行完毕后就调用该函数,只需要在该函数前加上特性 [ImageEffectOpaque] 这样就不会对透明物体产生影响
//加入该特性 就不会对透明物体产生影响
//[ImageEffectOpaque]
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{1.将源纹理直接复制到目标纹理//Graphics.Blit(source, destination);//把源纹理 通过 材质球当中的Shader进行效果处理 然后写入到目标纹理中 最终呈现在屏幕上Graphics.Blit(source, destination, material);
}
4、实现效果的关键——Graphics.Blit函数
Graphics.Blit函数用于将一个图像从一个纹理复制到另一个纹理,同时可以在这个过程中用着色器对图像进行处理,它有很多重载,主要讲解几个常用的:
(1)将源纹理直接复制到目标纹理
Graphics.Blit(Texture source, RenderTexture dest)
(2)将源纹理复制到目标纹理并应用一个材质
Graphics.Blit(Texture source, RenderTexture dest, Material mat, int pass = -1);source源纹理会被传递给mat材质中Shader中名为_MainTex的纹理属性用于进行处理
pass参数默认值为 - 1,表示会依次调用Shader内的所有Pass进行处理,否则,只会调用给定索引的Pass
5、屏幕后处理基类
补充:
(1)Shader.isSupported
通过获取Shader对象中的isSupported属性判断Shader在目标平台和硬件上是否能正确运行
(2)[ExecuteInEditMode]特性
用于使脚本在编辑器模式下也能执行
(3)[RequireComponent(typeof(组件名))]特性
指定某个脚本所依赖的组件,它确保当你将脚本附加到游戏对象时,所需的组件也会自动添加到该游戏对象中,如果这些组件已经存在,它们不会被重复添加,因为后处理脚本一般添加到摄像机上,因此我们用于依赖摄像机
(4)材质球中的 HideFlags 枚举
从材质球对象中可以点出 HideFlags 枚举
- HideFlags.None: 对象是完全可见和可编辑的。这是默认值。
- HideFlags.HideInHierarchy: 对象在层级视图中被隐藏,但仍然存在于场景中。
- HideFlags.HideInInspector: 对象在检查器中被隐藏,但仍然存在于层级视图中。
- HideFlags.DontSaveInEditor: 对象不会被保存到场景中。适用于编辑器模式,不会影响播放模式。
- HideFlags.NotEditable: 对象在检查器中是只读的,不能被修改。
- HideFlags.DontSaveInBuild: 对象不会被包含在构建中。
- HideFlags.DontUnloadUnusedAsset: 对象在资源清理时不会被卸载,即使它没有被引用。
- HideFlags.DontSave: 对象不会被保存到场景中,不会在构建中保存,也不会在编辑器中保存。这是 DontSaveInEditor | DontSaveInBuild | DontUnloadUnusedAsset 的组合。
如果想要设置枚举满足多个条件 直接多个枚举 进行位或运算即可 |
为什么要实现屏幕后处理基类
原因一:为了实现屏幕后期处理效果,每次都需要做的事情一定是
- 实现一个继承子MonoBehaviour的自定义C#脚本
- 关联对应的材质球或者Shader
- 实现OnRenderImage函数
- 在OnRenderImage函数中使用Graphics.Blit函数
那么这些共同点我们完全可以抽象到一个基类中去完成,以后只需要在子类中实现各自的基本逻辑即可
原因二:可以在基类中用代码动态创建材质球,不需要为每个后处理效果都手动创建材质球,只需要在Inspector窗口关联对应使用的Shader即可
原因三:在进行屏幕后处理之前,往往需要检查一系列条件是否满足,比如:
当前平台是否支持当前使用的Unity Shader,我们可以在基类中进行判断,避免每次书写相同逻辑
注意:
在一些老版本中,你可能还会在基类中判断目标平台是否支持屏幕后处理和渲染纹理,一般通过Unity中的SystemInfo类判断,该类可以用于确定底层平台和硬件相关的功能是否被支持
官方说明:https://docs.unity.cn/cn/2022.3/ScriptReference/SystemInfo.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour
{// 屏幕后处理效果会使用的Shaderpublic Shader shader;// 动态创建的材质球private Material _material;protected Material material {get {if (shader == null || !shader.isSupported)return null;else {if (_material != null && _material.shader == shader)return _material;// 用支持的 Shader 动态创建一个材质球用于渲染_material = new Material(shader);_material.hideFlags = HideFlags.DontSave;return _material;}}}protected virtual void OnRenderImage(RenderTexture source, RenderTexture destination) {UpdateProperty();if (material != null)Graphics.Blit(source, destination, material);elseGraphics.Blit(source, destination);}protected virtual void UpdateProperty() {}
}
相关文章:
屏幕后期处理
1、屏幕后期处理效果 屏幕后期处理效果( Screen Post-Processing Effects)是一种在渲染管线的最后阶段应用的视觉效果,允许在场景渲染完成后对最终图像进行各种调整和效果处理,从而增强视觉体验 常见的屏幕后期处理效果有&#x…...
K8资源之endpoint资源EP资源
1 endpoint资源概述 endpoint资源在K8S中用来表s示vc与后端 Pod 之间的连接关系的对象。当创建svc时,svc根据标签是否相同或svc名字是否和ep名字相同,把svc和ip关联上。 删除svc时,会自动的删除同名的ep资源。 2 ep资源和svc的关联测试 […...

微软日志丢失事件敲响安全警钟
NEWS | 事件回顾 最近,全球最大的软件公司之一——微软,遭遇了一场罕见的日志丢失危机。据报告,从9月2日至9月19日,持续长达两周的时间里,微软的多项核心云服务,包括身份验证平台Microsoft Entra、安全信息…...

Qt生成应用程序exe
1. 将工程用MinGW编译器在release模式下编译,生成可执行文件XXX.exe,新建一个文件夹如:F:\Setup\minGW,把exe文件放到这个目录下。 2. 将该编译器的bin文件添加到PATH环境变量里:bin文件路径为:D:\Qt\Qt5.…...
C#中的HttpContent、HttpClientHandle、HttpWebRequest
C#中的HttpContent 在C#中,HttpContent 是 System.Net.Http 命名空间下的一个类,它是 HttpClient 类用来发送和接收HTTP内容的基础。HttpContent 表示HTTP请求或响应的正文内容,并且可以序列化和反序列化数据。 HttpContent 是一个抽象类&a…...
23.网工入门篇--------介绍一下园区网典型组网架构及案例实践
园区网典型组网架构主要分为小型、中型、大型三种类型,以下是详细介绍及相关案例实践: 小型园区网: 架构特点: 用户规模:适用于接入用户数量较少的场景,一般支持几个至几十个用户。覆盖范围:仅限…...

QT鼠标事件
QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目,在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件,选择 C Class 自定义类名Mylabel,选择基类Base …...

Ubuntu 的 ROS 操作系统turtlebot3环境搭建
引言 本文介绍如何在Ubuntu系统中为TurtleBot3配置ROS环境,包括安装和配置ROS Noetic的步骤,为PC端控制TurtleBot3提供操作指南。 安装和配置的过程分为PC设置、系统安装、依赖安装等部分,并在最后进行网络配置,确保PC端能够顺利…...

C++笔记---异常
1. 异常的概念 1.1 异常和错误 异常通常是指在程序运行中动态出现的非正常情况,这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。 错误通常是指那些会导致程序终止的,无法动态处理的非正常情况。例如,越界访问、栈溢出…...
Python 操作数据库:读取 Clickhouse 数据存入csv文件
import pandas as pd from clickhouse_driver import Client import timeit import logging import threading from threading import Lock from queue import Queue from typing import List, Dict, Set from contextlib import contextmanager import os import time# 配置参…...

如何找到系统中bert-base-uncased默认安装位置
问题: 服务器中无法连接huggingface,故需要自己将模型文件上传 ubuntu 可以按照这个链接下载 Bert下载和使用(以bert-base-uncased为例) - 会自愈的哈士奇 - 博客园 里面提供了giehub里面的链接 GitHub - google-research/be…...

在启动 Spring Boot 项目时,报找不到 slf4j 的错误
而且 tomcat 的启动信息不知道为什么输出出来了 问 AI 得到的解决方案: 将 pom.xml 中的如下配置替换成这样,排除这个插件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring - boot - starter - …...
android-12-source-code--write-file-function
find /app4/lineage19_oneplus6/system/ -name "*.cpp" -type f | while read -r k ; do ( grep -i write $k | grep -i file && echo $k ;) ; done获得android::base::WriteStringToFile, 进一步修改 find /app4/lineage19_oneplus6/system/ -name &qu…...
SQL(2)
一.时间盲注 有回显时用Union带出数据,只显示是否时可用布尔盲注得出数据,那如果没有任何输出时? 比如无论查询什么,都显示success,同一个回应,无法直接从服务器注入出任何数据,但是我们可以利…...

【IC每日一题:AMBA总线--APB协议时序及Verilog实现】
AMBA总线--APB协议时序及Verilog实现 1 APB3协议1.1 APB3时序1.1.1 APB写操作1.1.2 APB读操作 2 代码2.1 apb_master2.2 apb_slave 【博客首发于微信公众号《漫谈芯片与编程》,欢迎专注一下,多谢大家】 AMBA总线是用于连接微控制器和外围设备的总线协议&…...

抢先看!为什么很多公司会强行给员工电脑加屏幕水印?千字长文来解答
2024年度热议:为什么很多公司会强行给员工电脑加屏幕水印? 有人说:概是为了让员工时刻铭记,工作就像这水印,无处不在,想逃也逃不掉! “玩归玩,闹归闹”。 本文将对此进行详尽解答&…...
【AI技术】PaddleSpeech部署方案
【AI技术】PaddleSpeech部署方案 技术介绍优点缺点 部署基础环境的搭建分步详解国内镜像源切换所需环境1 g所需环境2 vim所需环境3 cuda所需环境4 cudnn所需环境5 ssl源码拉取PaddleSpeech环境安装 部署文件分享DockerHub 技术介绍 PaddleSpeech是飞浆平台的一款TTS框架。 优…...

可灵开始“独闯”,全面拥抱AI的快手能否尝到“甜头”?
现任谷歌CEO桑达尔皮查伊曾说到,“人工智能是我们人类正在从事的最为深刻的研究方向之一,甚至要比火与电还更加深刻。” 正如,Sora诞生时,在官方表述中被称为“世界模拟器”,它理解真实的规则,并在此基础上…...

qt QtConcurrent 详解
1、概述 QtConcurrent是Qt框架中用于简化多线程编程的一个模块,它提供了高层次的API来实现并行计算,而不需要开发者直接管理线程的创建、调度和销毁。QtConcurrent主要通过QFuture和QThreadPool来进行并发任务的执行,能够自动利用系统的所有…...
基于构件的软件开发、软件维护、区块链技术及湖仓一体架构的应用
目录 试题一 论基于构件的软件开发方法及其应用 试题二 论软件维护方法及其应用 试题三 论区块链技术及应用 试题四 论湖仓一体架构及其应用 相关推荐 试题一 论基于构件的软件开发方法及其应用 基于构件的软件开发(Component-Based Software Development,CBSD…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...