Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)

news2024/10/2 20:30:58

Unity 之 后处理实现界面灰度效果

  • 前言
  • 一,Post Processing
    • 1.1 设置组件
    • 1.2 代码控制
  • 二,Shader材质实现
    • 2.1 原理API
    • 2.2 编写Shader
    • 2.3 编写代码
    • 2.4 实现效果
  • 效果展示

前言

在Unity中实现后处理效果有两种方式:一种是通过使用Unity官方提供的Post-Processing插件。另外一种方式就是使用脚本获取到渲染后帧缓冲区的图像,再通过shader写后处理的效果,最后合并输出图像到屏幕上。


一,Post Processing

1.1 设置组件

Post Processing后处理插件的工程配置:Unity 之 Post Processing后处理不同项目配置(UPR项目配置)

这里我们用到的只有:Color Grading 色彩调整

此组件可以使一个用到的特效,用于校正镜头中的颜色与亮度,来实现电影或海报效果,可以理解为手机中的何种滤镜。

这个组件设置项很多,此篇文章中介绍的灰度效果只需要使用到一个,那就是:Saturation 饱和度

Saturation值调整为-100,则可以实现灰度效果。随便大家一个界面测试一下:


1.2 代码控制

我这里创建了一个Slider,来动态控制Saturation 饱和度的值。创建代码命名为PostProcessingProfile 将其挂载到场景中PostProcessProfile的物体上,就可以实现开篇看到的滑动条控制灰度效果了:

具体代码如下,

using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.UI;

public class PostProcessingProfile : MonoBehaviour
{
    public Slider Slider_Profile;
    
    // 后处理的配置容器
    private PostProcessVolume _volume;
    // 根据Inspector面板上的组件创建对应类型变量
    private ColorGrading _colorGrading;
    
    void Start()
    {
        // 获取容器
        _volume = GetComponent<PostProcessVolume>();
        // 获取此容器下添加的组件
        _volume.profile.TryGetSettings(out _colorGrading);
        
        Slider_Profile.onValueChanged.AddListener(OnValueChangedSlider);
    }

    void OnValueChangedSlider(float progress)
    {
        Debug.Log(progress + " " + (progress * 100 - 100));
        // 控制灰度值的变化 (-100 0 -> 0-1)
        _colorGrading.saturation.Override(progress * 100 - 100);
    }
}

二,Shader材质实现

2.1 原理API

Unity在摄影机完成渲染后调用的事件函数,允许您修改摄影机的最终图像。

Unity后处理OnRenderImage

在内置渲染管道中,Unity在摄影机完成渲染后,调用MonoBehaviours上的OnRenderImage,该MonoBeh aviours作为已启用的摄影机组件附加到同一GameObject。您可以使用OnRenderImage创建全屏后处理效果。这些效果通过从源图像读取像素,使用Unity着色器修改像素的外观,然后将结果渲染到目标图像中来实现。通常使用图形。Blit执行这些步骤。

Graphics.Blit 官方文档:使用着色器将源纹理复制到目标渲染纹理。
Blit将dest设置为渲染目标,在材质上设置source_MainTex属性,并绘制全屏四边形。

若要blit到内置渲染管道中的屏幕后缓冲区,必须确保dest为空,并且摄影机为空。Camera的targetTexture属性。main也为空。如果dest为空,Unity将尝试使用Camera.main.targetTexture作为目标。


2.2 编写Shader

当输出的RGB值相同的时候,就变成了灰度图。所以只要在渲染输出颜色值的地方,将RGB输出为相同的值就可以实现了。

实现相同值的我们一般使用是加权平均值的做法,目前最常用的一组灰色RGB值是(0.299,0.587,0.114)。

具体怎么来的我也算不明白,感兴趣的同学可以搜索:在使彩色图变灰RGB的权重会固定为(R:0.299 G:0.587 B:0.114)? 学习一下。

最终Shader如下:

Shader "Custom/GrayAll"
{
    Properties
    {
        _MainTex("Base (RGB)", 2D) = "white" {}
        // 灰度值
        _Color("GaryScale Amount", Range(0.0, 1.0)) = 1.0
 
    }
 
    SubShader
    {    
        Pass{
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            
            #include "UnityCG.cginc"
            
            uniform sampler2D _MainTex;
            fixed _Color;
     
            fixed4 frag(v2f_img i) : COLOR
            {
                fixed4 renderTexture = tex2D(_MainTex, i.uv);
                
                float grayValue = 0.299 * renderTexture.r + 0.587 * renderTexture.g + 0.114 * renderTexture.b;
                
                fixed4 finalColor = lerp(renderTexture, grayValue, _Color);
                
                return finalColor;
            }        
            ENDCG
        }
    }
    FallBack "Diffuse"
}

最后创建一个材质球使用上面创建的这个Shader,待下面使用:


2.3 编写代码

创建代码SetGrayScene,并将其挂载到摄像机上,通过2.1中介绍的OnRenderImageGraphics.Blit实现,具体代码如下:

using UnityEngine;

public class SetGrayScene : MonoBehaviour
{
    public Material grayMaterial;
    [Range(0f,1f)]
    public float grayScaleAmount = 1.0f;
    
    void Start()
    {
        // 判断终端是否支持
        if (grayMaterial != null && grayMaterial.shader.isSupported == false)
        {
            enabled = false;
        }
    }

    void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
    {
        if (grayMaterial != null)
        {
            grayMaterial.SetFloat("_Color", grayScaleAmount);
            Graphics.Blit(sourceTexture, destTexture, grayMaterial);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }
    }
}

最后将2.2中创建的材质球,赋值给挂到摄像机的脚本上:


2.4 实现效果

运行游戏,调整grayScaleAmount值即可看到效果。

实现效果:

grayScaleAmount值调整到1


效果展示

使用Post Processing的效果:

使用Shade的效果:

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

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

相关文章

H3C AC三层组网架构,AP自动上线自动固化

核心交换机: [HX]dis cu [HX]dis current-configuration version 7.1.075, Alpha 7571 sysname HX irf mac-address persistent timer irf auto-update enable undo irf link-delay irf member 1 priority 1 dhcp enable lldp global enable system-working-mode standard xbar…

[附源码]计算机毕业设计仓库管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C#连接MySql数据库

C#连接MySql数据库 具体步骤如下 第一步&#xff1a;提前将mysql服务打开&#xff0c;用xampp的需要将Mysql服务开启&#xff1b; 第二步&#xff1a;新建一个C#项目 第三步&#xff1a;在项目中下载&#xff1a;MySql.Data的NuGet&#xff0c;作者为Oracle&#xff1b; 第四布…

免息配资天宇优配|世界杯与A股有何关系?券商这样分析!

世界杯与A股有何联系&#xff1f; 卡塔尔世界杯开幕近两周&#xff0c;世界各地球迷热切关注。与此一起&#xff0c;不少金融机构“频频出镜”&#xff0c;多家券商发布了世界杯相关论题研究报告&#xff0c;讨论“世界杯效应”是否存在、世界杯期间是否利好大消费板块等论题。…

代码随想录刷题|LeetCode 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

目录 309.最佳买卖股票时机含冷冻期 思路 1、确定dp数组以及下标含义 2、确定递推公式 3、初始化 4、遍历顺序 5、获取结果 最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 思路 买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;力扣…

Kafka的存储机制和可靠性

Kafka存储机制前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5…

【正厚软件】0基础学IT,来Linux的发展历史吧

本文来源&#xff1a;正厚软件沙老师 Linux 的发展历史 1991年林纳斯.托瓦兹开发了Linux内核&#xff0c;宣布它的诞生。 1999年&#xff0c;IBM宣布于RedHat公司建立伙伴关系&#xff0c;以确保RedHat在IBN机器上的正确运行。 2001年&#xff0c;IBM决定投入10亿美元扩大Linux…

光源基础(4)——如何选择光源及各种打光结构

如何选择和设计光源方案 打光的首要目的是把目标显现出来&#xff0c;同时把背景和干扰信息尽可能地过滤掉或者淡化&#xff0c;这样就可以得到有利于处理的图像&#xff0c;整个系统的精度和稳定性也可以得到必要的保证。 基本思路 如右图所示,光照射到物体表面之后,会发生一系…

Cadence Allegro PCB设计88问解析(十九) 之 Allegro中文字大小设置

个学习信号完整性仿真的layout工程师 在PCB投板之前&#xff0c;经常会进行丝印调整。当然有的单板设计&#xff0c;比如手机这种高密度单板是没有丝印的。但是在绝多数的PCB上是添加丝印的&#xff0c;为了方便前期的测试。丝印也就是我们常说的器件的位号&#xff0c;还包括一…

线上线程池配置错误导致服务故障

背景 某个早高峰&#xff0c;服务大量抛出线程拒绝的异常&#xff0c;同时没有触发自动扩容&#xff0c;损失了大量请求&#xff0c;影响了单量 原因分析 5why分析法 1、为什么服务抛出线程拒绝&#xff1f; rpc线程池设置为了256&#xff0c;故障期间线程处理慢&#xff0c…

【华秋Nidec尼得科】滑动开关CL-SB的应用

01 什么是滑动开关 滑动开关是用于选择、接通或断开电路的较成熟技术之一, 但由于其纯机电性质, 作为控制或交互机器或过程的某个方面的一种低成本和可靠手段&#xff0c;在现今仍然广为使用。滑动开关被设计成由人的手指驱动, 通常用于工业、商业、电信和消费类应用, 为人与机…

hadoop 3.x大数据集群搭建系列8- 一些辅助的shell脚本

文章目录一. jps查看各个节点后台进程二. 启停hadoop集群三. 群起zookeeper集群脚本zk.sh四. 同步文件五. 启动停止整个集群一. jps查看各个节点后台进程 我们经常需要查看各个节点的进程情况 vi jps.sh #!/bin/bash for i in hp5 hp6 hp7 do echo -------------------------…

MATLAB绘图合集:fcontour绘制隐函数等高线图

本文主要介绍隐函数等高线图的绘制。 说明 fcontour(f) 根据 x 和 y 的默认区间 [-5 5] 和 z 的固定级别值绘制 z f(x,y) 函数的等高线。 fcontour(f,xyinterval) 将在指定区间绘图。要对 x 和 y 使用相同的区间&#xff0c;请将 xyinterval 指定为 [min max] 形式的二元素向量…

单视频播放量超20万的公开课配套教材,猫书来了~

吹爆、强推、比刷剧还爽、一生推、传疯了&#xff01; 很难想象&#xff0c;网友们会用这些词来形容一个纯分享深度强化学习基础知识的视频课。 在 B 站上搜索 “深度强化学习”&#xff0c;在排名 TOP 10 的相关课程中&#xff0c;有 4 个是王树森老师的 Reinforcement Learni…

基于CFD的车辆进气系统流场仿真与分析

目 录 摘 要 I ABSTRACT II 第1章 绪论 1 1.1研究背景 1 1.2研究现状 2 1.2.1国外的研究概况 2 1.2.2国内的研究概况 3 1.3研究思路及方法 4 第2章 车辆进气系统流场消声元件设计 6 2.1进气系统概述 6 2.1.1进气系统结构及工作原理 6 2.1.2进气噪声的产生机理 7 2.2进气消声元件…

编译原理期末总结

思维导图&#xff1a; 引论 编译程序的过程&#xff1a; 词法分析——>语法分析——>语义分析——>中间代码生成——>代码优化——>目标代码生成 其中中间代码生成和代码优化不是必要的。 文法和语言 1.巨型和句子的区别 句型>句子,句子是终结符串&am…

两周内创作纪念日——stay hungry stay foolish

&#x1f4eb;作者简介&#xff1a;咸鱼爱搞机 &#x1f4eb; 热衷分享&#xff0c;喜欢原创~ 关注我会给你带来一些不一样的认知和成长 &#x1f525;如果觉得此文还不错的话&#xff0c;还请&#x1f44d;关注、点赞、收藏三连支持&#x1f44d;一下博主 机缘 说来也巧&…

LeetCode 1769. 移动所有球到每个盒子所需的最小操作数

【LetMeFly】1769.移动所有球到每个盒子所需的最小操作数 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-operations-to-move-all-balls-to-each-box/ 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes &#xff0c;其中 boxes[i] 的值为 0 表…

D. Vupsen, Pupsen and 0(思维 + 从小部分入手(由小推大))

Problem - 1582D - Codeforces Vupsen和Pupsen被赠予一个整数数组。由于Vupsen不喜欢数字0&#xff0c;他把数组中所有等于0的数字都扔掉了。结果&#xff0c;他得到一个长度为n的数组a。 相反&#xff0c;Pupsen喜欢数字0&#xff0c;当他看到没有0的数组时&#xff0c;他很…

【Linux系统】第三篇:Linux中软件包管理器yum的使用

文章目录一、yum1、 什么是软件包和软件包管理器2、 什么是yum3、 Linux下软件安装的几种方式4、 使用yum的注意事项5、 yum的使用二、Linux / Windows下的数据互传1、 lrzsz的安装2、rzsz工具3、将Windows的数据传到Linux中4、将Linux的数据传到Windows中三、yum源配置文件1、…