第十二章 屏幕后处理效果

news2024/11/25 18:53:07

屏幕后处理效果是实现屏幕特效的常见方法。

建立一个基本的屏幕后处理的脚本

屏幕后处理指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。

想要实现屏幕后处理的基础在于抓取屏幕。Unity为我们提供了一个接口-OnRenderImage函数。

声明如下:MonoBehaviour.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执行完毕后立即调用OnRenderImage函数,从而不对透明物体产生任何影响。此时,我们可以在OnRenderImage函数前添加ImageEffectOpaque属性来实现这样的目的。

要实现屏幕后处理过程如下:

using UnityEngine;
using System.Collections;

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

//提前检查资源是否满足
protected void CheckResources()
{
bool isSupported = CheckSupport();

if (isSupported == false)
{
NotSupported();
}
}
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;
}
protected void NotSupported()
{
enabled = false;
}

protected void Start()
{
CheckResources();
}

//指定一个Shader来创建一个用于处理渲染纹理的材质
//CheckShaderAndCreateMaterial接受两个参数,第一个参数指定了该特效需要使用的Shader,第二个参数则是用于后期处理的材质。该函数首先检查Shader可用性,检查通过后就返回一个使用了该Shader的材质,否则返回null
protected Material CheckShaderAndCreateMaterial(Shader shader, Material material)
{
if (shader == null)
{
return null;
}

if (shader.isSupported && material && material.shader == shader)
return material;

if (!shader.isSupported)
{
return null;
}
else
{
material = new Material(shader);
material.hideFlags = HideFlags.DontSave;
if (material)
return material;
else
return null;
}
}
}

调整屏幕的亮度、饱和度和对比度

Shader "Unity Shaders Book/Chapter 12/Brightness Saturation And Contrast" {
	Properties {
		//Graphics.Blit(src, dest, material)将第一个参数传递给Shader中名为_MainTex的属性
		_MainTex ("Base (RGB)", 2D) = "white" {}
		//调整亮度
		_Brightness ("Brightness", Float) = 1
		//调整饱和度
		_Saturation("Saturation", Float) = 1
		//调整对比度
		_Contrast("Contrast", Float) = 1
	}
	SubShader {
		Pass {  
			//屏幕后处理实际上是在场景中绘制了一个与屏幕同宽同高的四边形面片。
			//关闭深度写入
			ZTest Always Cull Off ZWrite Off
			
			CGPROGRAM  
			#pragma vertex vert  
			#pragma fragment frag  
			  
			#include "UnityCG.cginc"  
			  
			sampler2D _MainTex;  
			half _Brightness;
			half _Saturation;
			half _Contrast;
			  
			//屏幕特效只需要进行必须的顶点变换,把正确的纹理坐标传递给片元着色器
			struct v2f {
				float4 pos : SV_POSITION;
				half2 uv: TEXCOORD0;
			};
			
			//使用Unity内置结构体appdata_img作为顶点着色器的输入,它只包含了图像处理时必须的顶点坐标和纹理坐标等
			v2f vert(appdata_img v) {
				v2f o;
				
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.uv = v.texcoord;
						 
				return o;
			}
		
			fixed4 frag(v2f i) : SV_Target {
				//得到对原屏幕图像采样结果renderTex
				fixed4 renderTex = tex2D(_MainTex, i.uv);  
				  
				//调整亮度
				fixed3 finalColor = renderTex.rgb * _Brightness;
				
				//计算该像素对应的亮度值luminance
				//对每个颜色分量乘以一个特定的系数再相加
				fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;
				//创建一个饱和度为0的颜色值
				fixed3 luminanceColor = fixed3(luminance, luminance, luminance);
				//使用_Saturation属性和颜色之间进行插值,得到希望的饱和度颜色
				finalColor = lerp(luminanceColor, finalColor, _Saturation);
				
				//创建一个对比度为0的颜色值
				fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
				//使用_Contrast属性在其和颜色值之间进行插值
				finalColor = lerp(avgColor, finalColor, _Contrast);
				
				return fixed4(finalColor, renderTex.a);  
			}  
			  
			ENDCG
		}  
	}
	
	Fallback Off
}

边缘检测

描边效果的一种实现方法。

边缘检测的原理是利用一些边缘检测算子对图像进行卷积操作。

什么是卷积

图像处理中,卷积操作指的是使用一个卷积核对一张图像中的每个像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1604643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记<2024.4.15-2024.4.21>:Attention Is All You Need

Transformer中Self-Attention以及Multi-Head Attention详解 (https://www.bilibili.com/video/BV15v411W78M/?spm_id_from333.337.search-card.all.click&vd_sourcef32decb03075b4a1833fe5c47c11ba94)

什么是CPU与GPU,它们之间有什么关系

什么是CPU与GPU,它们之间有什么关系一、CPU1. 核心功能2. 工作原理3. 组成部分4. 发展历程5. 性能指标6. 架构种类7. 发展趋势8. 应用领域 二、GPU三、CPU与GPU的关系 什么是CPU与GPU,它们之间有什么关系 一、CPU CPU,全称是“Central Proc…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库,具有分布式计算、事务支持、多模存储、以及流批一体等能力,非常适合作为一款理想的轻量级大数据平台,轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式,介绍如何通过 Dolphin…

uni-app项目引入阿里巴巴矢量图标库

uni-app项目引入阿里巴巴矢量图标库 1.下载图标库中的symbol下载至本地 2.解压文件夹并放入项目中 我这里放入的位置是src/static/icon目录下 3.修改文件指向路径为相对路径 即在路径iconfont前面添加斜杠 4.app.vue的style中引入 import static/icon/iconfont.css; 5…

支付宝下载饮品优惠券信息

日常场景 1:一个吃货奶茶瘾犯了,想喝点奶奶,想喝coco、书逸烧仙草、一点点。喝奶茶还想省点钱,看看哪个品牌优惠力度最大,支付宝一个一个搜索好麻烦啊~~~~~~ 2:某饮品品牌的营销,想了解目前市…

UKP3d,AutoPDMS设置埋地数据导出至AutoPSA的查看方法

一用户在设置了埋地数据,导出至AutoPSA未有数据。具体操作方法如下: AutoPSA里提供两种埋地计算,一是仿start计算;二是仿CII计算 1.AutoPSA10.0仿start计算新埋地模块的操作方法: AutoPSA10.0新埋地模块需要用户根据实…

预算不足千元SSL证书该怎么选?

随着互联网安全概念日渐深入人心,越来越多的企业或个人为自己的网站加装SSL证书;那对于个人或者小小微企业,预算不足千元的情况下该怎么选择SSL证书呢?可以从以下几个方面进行考量,以确保在有限的预算内获得满足基本安…

makefile第七讲

更多精彩内容在公众号。 当make执行完后,我们期望将最终的可执行文件安装到系统目录下,这样在不同的目录下都可以执行编译的可执行文件,相当于做成了个命令。这个就需要用到make install。 源文件如下:用于判断系统是小端还是大端…

Leetcode86_分隔链表

1.leetcode原题链接:. - 力扣(LeetCode) 2.题目描述 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的…

提升法律文书起草效率:AlphaGPT 助力律师快速生成诉讼和仲裁文件

法律文书起草对于法律专业人士而言是一项基础而关键的任务。无论是民事、刑事还是行政诉讼,以及仲裁案件,精确的法律文书撰写对于案件的成功至关重要。然而,这一过程往往既耗时又复杂,尤其是在处理复杂的案情和面对当事人难以理解…

ssm057学生公寓管理中心系统的设计与实现+jsp

学生公寓管理中心系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生,其可以帮助管…

MyBaties-plus 小蓝鸟 构造器 QueryWrapper 知识学习汇总

一、QueryWrapper是什么? QueryWrapper 是 mybatis-plus 条件构造器 https://mp.baomidou.com 小蓝鸟官方网址 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做…

Jmeter03:直连数据库

1 Jmete组件:直连数据库 1.1 是什么? 让Jmeter直接和数据库交互 1.2 为什么? 之前是通过接口操作数据库,可能出现的问题:比如查询可能有漏查误查的情况,解决方案是人工对不,效率低且有安全隐患…

【Python基础】异常

文章目录 [toc]什么是异常异常处理try...except...语句格式示例不使用异常处理时使用异常处理时 抛出异常示例 else语句格式示例 finally语句格式示例finally语句的作用 自定义异常类示例 个人主页:丷从心 系列专栏:Python基础 学习指南:Py…

论文复现---MUTANT

Robust anomaly detection for multivariate time series through temporal GCNs and attention-based VAE 基于时序神经网络和基于注意力的VAE的多变量时间序列鲁棒异常检测 https://github.com/Coac-syf/MUTANT * numpy1.21.2* torch1.9.1* scipy1.7.1* scikit-learn0.24.2*…

海信发布《黑神话:悟空》定制电视E8N新品,重塑大屏游戏体验

4月17日,在“AI美好生活”2024海信电视E8系列新品发布会上,海信电视官宣成为《黑神话:悟空》全球官方合作伙伴。同时,海信电视还为广大游戏玩家带来了《黑神话:悟空》的显示CP,推出了官方定制电视——旗舰新…

ModuleNotFoundError: No module named ‘scripts.animatediff_mm‘ 解决方案

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 安装 AnimateDiff 插件后出现的ModuleNotFoundError: No module named scripts.animatediff_mm异常的解决方案,希望…

Linux小知识:xargs命令的使用与技巧

在Linux系统中,命令行工具是用户与系统进行交互的重要桥梁。其中,xargs命令是一个非常实用的工具,它能够将标准输入的数据转换为命令行参数,从而方便用户对数据进行批量处理。今天,我们就来详细了解一下xargs命令的使用…

claude国内不能用

AnthropicAI 公司旗下的Claude 3 大型语言模型,以其卓越的性能直接挑战了GPT-4的市场地位。Claude 3 系列中包含了几个不同版本,如Claude 3 Opus、Claude 3 Sonnet 以及 Claude 3 Haiku,每个版本都针对特定的应用场景进行了优化。 在这些版本…

微信小程序的支付功能,纯前端步骤,超级详细

1、首先在微信开放平台,申请移动应用并开通支付功能,申请应用后可以获取 AppID 和 AppSecret 值 2、在前端项目中的配置参数中打开支付功能 步骤:项目的根目录下有个manifest.json文件,打开并在左侧目录找到APP SDK配置&#xf…