零基础带你看游戏内灰度效果实现原理
liuian 2025-05-08 02:45 62 浏览
前言
在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中介绍的OnRenderImage和Graphics.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的效果:
相关推荐
- win官网网址(win官方网站)
-
具体方法如下:打开电脑,在浏览器地址栏输入window,就会进入win中文官网,然后再寻找自己需要的软件,升级包等就可以了。下面是windows官网网址:1http://www.microsoft.c...
- wifi网址登录入口(wifi网址登录入口有哪些)
-
wifi网页登录入口是网关地址192.168.1.1.1.首先检查路由器线路连接(参考前面手机设置路由器部分)2.将电脑Tnternet协议(TCP/IP)属性设置为“自动获取IP地址”和“自...
- 没有驱动程序怎么安装打印机
-
(1)启动电脑进入Windows操作系统,在桌面上单击开始-设置-打印机。(2)用鼠标右单击安装好的打印机图标,在弹出的右键菜单中选择属性,然后单击打印测试页按钮。(3)此时打印机会打出一页信息,从这...
- u盘怎么取消写保护状态(u盘如何解除写保护状态)
-
如果您的U盘被设置为写保护,您可以尝试以下方法来关闭写保护:1.检查U盘上的物理开关:一些U盘上可能有一个物理开关,用于启用或禁用写保护。请检查U盘的外壳,看看是否有这样的开关,并将其切换到未锁定的...
- 压缩文件查看器(压缩文件查看器密码是多少)
-
1,打开手机上面的文件管理器,找到要压缩的WPS文件。2,长按一下WPS文件,然后选择要压缩的文件。3,点击右下角的【更多】,选择【压缩】。4,对压缩文件进行保存,压缩完成。扩展资料:wps产品特点1...
- 键盘哪个是截图键(键盘中的截图键是哪一个)
-
1、按Prtsc键截图这样获取的是整个电脑屏幕的内容,按Prtsc键后,可以直接打开画图工具,接粘贴使用。也可以粘贴在QQ聊天框或者Word文档中,之后再选择保存即可。2、按Ctrl+Prtsc键截图...
- flash插件电脑版下载(flash插件下载安装)
-
可以不安装,不安装对电脑也不会有什么影响。友情提示,最好安装,这个也不会占用你多少内存,它是用来播放网页中的flash文件的。如果你不安装,网页中的flash动画就不能正常播放。浏览器也会提示你安装!...
- foxmail邮箱怎么设置(foxmail邮箱设置成功后点完成没反应)
-
操作步骤/方法1.打开新建界面:2.打开foxmail,在上方导航栏处找到“邮箱(B)”点开此功能,会看到一个下拉菜单,在下拉菜单中找到“新建邮箱账户(N)”。3.建立账户信息:4.点击“新建邮箱账...
- 电脑自动关机解决办法(电脑自动关机,原来是这里出了问题)
-
电脑自动关机的原因一、系统文件损坏一个完整的系统受到袭击之后,电脑就不能进行初始化,从而引起自动关机,这也是一个常见的原因。可以选择重装系统的方法来解决问题。电脑自动关机的原因二、CPU太热这是电脑自...
- m2固态硬盘安装系统教程(m2固态如何装系统)
-
加装m.2固态硬盘后,重装系统的操作步骤如下:1、下载U盘启动盘制作工具,下载一个GHOST版最新的WIN7,准备一个足够大的U盘(16G足够了),用U盘启动盘制作工具将其制作成启动U盘;2、插入新电...
- 运行chkdsk工具(运行chkdsk工具怎么解决)
-
1、win+R键打开运行,输入cmd。2、输入并回车执行chkdsk/?命令,可以了解chkdsk命令的使用方法。3、比如一些常用的命令,输入并按回车执行chkdskm:/f命令,可以检...
- 办公软件2007官方下载免费完整版
-
office字体都变成了英文是因为设置了英文模式。具体的解决步骤如下:我们需要准备的材料分别是:电脑、Word文档。1、首先我们打开Word文档,点击打开左上角的文件中的“选项”。2、然后我们在弹出来...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
