【Unity3D】调整屏幕亮度、饱和度、对比度

1 屏幕后处理流程

        调整屏幕亮度、饱和度、对比度,需要使用到屏幕后处理技术。因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度、饱和度、对比度的实现。

        屏幕后处理即:渲染完所有对象后,得到一张屏幕图像,对该屏幕图像进一步处理的过程称为屏幕后处理。屏幕后处理一般在 MonoBehaviour 生命周期 的 OnRenderImage 方法中进行,如下,src 是渲染完所有对象后的屏幕图像,dest 是经屏幕后处理得到的目标图像。如果用户想在不透明的 Pass 执行完毕后立即调用 OnRenderImage 方法,可以在 OnRenderImage 方法前面加上 [ImageEffectOpaque] 标签。

// [ImageEffectOpaque] // 在不透明的Pass执行完毕后立即调用OnRenderImage方法
void OnRenderImage(RenderTexture src, RenderTexture dest)

         在 OnRenderImage 方法里,通常使用 Graphics.Blit 方法完成对纹理的处理,如下是常用的 Bilt 方法,source 是源纹理,dest 是目标纹理,mat 是进行屏幕后处理的材质,用户可以在该材质绑定的 Shader 中实现屏幕后处理特效。注意,屏幕后处理的 Shader 中必须包含名为 "_MainTex" 的纹理属性,用户在调用 Graphics.Blit 方法时会自动将 source 赋值给 Shader 中的 _MainTex 属性。

public static void Blit(Texture source, RenderTexture dest)
public static void Blit(Texture source, RenderTexture dest, Material mat, [Internal.DefaultValue("-1")] int pass)
public static void Blit(Texture source, Material mat, [Internal.DefaultValue("-1")] int pass)

        另外,用户通过 CommandBuffer.DrawRenderer 和 Graphics.ExecuteCommandBuffer 也可以实现 Graphics.Blit 效果,详见案例:选中物体描边特效,主要流程如下:

CommandBuffer commandBuffer = new CommandBuffer();
RenderTexture tempTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 0);
commandBuffer.SetRenderTarget(tempTex);
commandBuffer.ClearRenderTarget(true, true, Color.clear); // 设置模板清屏颜色为(0,0,0,0)
commandBuffer.DrawRenderer(renderer, effectMaterial); // renderer是物体的Render组件, effectMaterial是特效材质
Graphics.ExecuteCommandBuffer(commandBuffer);
// use tempTex
RenderTexture.ReleaseTemporary(tempTex); // 使用完tempTex后, 需要释放掉

        在 Shader 中,用户也可以通过 GrabPass 抓取屏幕图像,详见案例:反射和折射。

2 亮度、饱和度、对比度

        1)亮度

        亮度表示颜色的明暗程度,亮度越高,颜色越亮,灰度值也越高。

        2)饱和度

        饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的颜色都是高度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如绛紫,粉红,黄褐等。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色。

        3)对比度

        对比度指一幅图像灰度反差的大小,即最大亮度与最小亮度之比。对比度越大,不同颜色之间的反差越大,黑白分明,对比度过大,图像会显得刺眼;对比度越小,不同颜色之间的反差越小,对比度过小,画面会显得灰蒙蒙。

3 代码实现

        BrigSatuCont.cs

using UnityEngine;[ExecuteInEditMode] // 编辑态可以查看脚本运行效果
[RequireComponent(typeof(Camera))] // 需要相机组件
public class BrigSatuCont : MonoBehaviour {[Range(0.1f, 3.0f)]public float brightness = 1.0f; // 亮度[Range(0.1f, 3.0f)]public float saturation = 1.0f; // 饱和度[Range(0.1f, 3.0f)]public float contrast = 1.0f; // 对比度private Material material; // 材质private void Start() {material = new Material(Shader.Find("MyShader/BrightnessSaturationContrast"));material.hideFlags = HideFlags.DontSave;}//[ImageEffectOpaque] // 在不透明的Pass执行完毕后立即调用OnRenderImage方法void OnRenderImage(RenderTexture src, RenderTexture dest) {if (material != null) {material.SetFloat("_Brightness", brightness); // 设置亮度material.SetFloat("_Saturation", saturation); // 设置饱和度material.SetFloat("_Contrast", contrast); // 设置对比度Graphics.Blit(src, dest, material);} else {Graphics.Blit(src, dest);}}
}

        BrigSatuCont.Shader

Shader "MyShader/BrightnessSaturationContrast" { // 调整亮度、饱和度、对比度Properties {_MainTex ("Base (RGB)", 2D) = "white" {} // 主纹理_Brightness ("Brightness", Float) = 1 // 亮度_Saturation("Saturation", Float) = 1 // 饱和度_Contrast("Contrast", Float) = 1 // 对比度}SubShader {Pass {// 深度测试始终通关, 关闭深度写入ZTest Always ZWrite OffCGPROGRAM #pragma vertex vert_img // 使用内置的vert_img顶点着色器#pragma fragment frag #include "UnityCG.cginc"sampler2D _MainTex; // 主纹理half _Brightness; // 亮度half _Saturation; // 饱和度half _Contrast; // 对比度fixed4 frag(v2f_img i) : SV_Target { // v2f_img为内置结构图, 里面只包含pos和uvfixed4 tex = tex2D(_MainTex, i.uv); // 纹理采样fixed3 finalColor = tex.rgb * _Brightness; // 应用亮度_Brightnessfixed luminance = 0.2125 * tex.r + 0.7154 * tex.g + 0.0721 * tex.b; // 计算亮度fixed3 luminanceColor = fixed3(luminance, luminance, luminance); // 饱和度为0、亮度为luminance的颜色finalColor = lerp(luminanceColor, finalColor, _Saturation); // 应用饱和度_Saturationfixed3 avgColor = fixed3(0.5, 0.5, 0.5); // 饱和度为0、亮度为0.5的颜色finalColor = lerp(avgColor, finalColor, _Contrast); // 应用对比度_Contrastreturn fixed4(finalColor, tex.a);  }  ENDCG}}Fallback Off
}

        运行效果:

        1)调整亮度

        2)调整饱和度

        3)调整对比度

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

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

相关文章

android装备选择,巫师三前期必拿装备武器_巫师三前期必拿最强装备推荐选择_攻略...

巫师三狂猎是巫师系列游戏的第三部,游戏是根据小说改编而来,既有小说的剧情又有精美逼真的游戏画面,曾获奖无数!第三部的游戏剧情是讲主人公杰洛特(猎魔人)的最终冒险。游戏以战斗为主,并结合主线任务和支线任务&#…

哈利波特AR游戏-巫师联盟 深度解析

今年AR技术的进展,及相关应用值得我们关注。给大家推荐一个AR游戏,应该会超越Pokemon Go。 [ 哈利波特:巫师联盟 ] 这一天可能是魔法世界最重要的一天 AR游戏《哈利波特:巫师联盟》 于2019年6月20日正式上线。 全世界的哈利波特迷&#xff…

大地图开发管理:《巫师3》Umbra遮挡剔除技术

本演讲介绍巫师3使用Umbra实现的遮挡剔除技术。笔记略过了一些过于平凡的实现细节,包括流的加载,如何向Umbra提交数据;也略过了一半以上关于“游戏应当如何选择中间件”的讨论。Umbra 3Umbra是一个芬兰中间件公司,做出核心技术之后…

《巫师3:狂猎》4.01版更新 PC端已上线

去年12月,《巫师3》免费升级次世代版,加入DLSS 3支持,RTX 40系显卡的用户能直接提升体验感,RTX 30系用户能通过DLSS 2获得更稳定的帧数。 目前。《巫师3:狂猎》4.01版已更新上线,在PC、PlayStation 和 Xbo…

哈利波特3 阿兹卡班的囚徒

《哈利波特3阿兹卡班的囚徒》DVD国语配音高清收藏版《哈利波特3:阿兹卡班的囚徒》 片名:Harry Potter and the Prisoner of Azkaban 译名:哈利波特3:阿兹卡班的囚徒 导演:阿方索卡隆Alfonso Cuaron 主演:丹…

昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络

巫师之昆特牌这款游戏相信大家都不陌生吧,最近小编经常收到巫师之昆特牌总是显示无法连接网络问题的反馈,接下来小编就为大家提供几种常见的处理方案。 巫师之昆特牌游戏简介 《巫师之昆特牌》是由CD PROJEKT RED开发的一款卡牌类游戏。 游戏的主角是北方…

c语言谭浩强百草园有卖吗,巫师3白果园有什么神器

巫师3这款游戏中,装备对玩家是有一定的影响的,在白果园中隐藏着两个前期神器,是两件毒蛇学派的装备,在哪里呢,下面游戏吧小编为大家带来介绍。 巫师3白果园有什么神器 白果园神器指的是白果园中毒蛇学派的毒蛇钢剑和毒…

讯飞星火认知大模型与ChatGPT的对比分析

引言: 人工智能是当今科技领域的热门话题,自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言,实现人机交互和智能服务。近年来,随着深度学习的发展,自然语言处理领域出现了许多创…

【数据结构6】二叉树的基本操作

文章目录 ⭐️写在前面的话⭐️二叉树的一些基本操作1、结构定义2、先序创建这棵树3、按满二叉树方式创建4、三种递归遍历5、层次遍历6、求二叉树的深度7、求叶子结点数8、三种非递归遍历9、先序线索化二叉树10、先序线索化后遍历11、中序线索化二叉树12、中序线索化后遍历主函…

C语言——每日一题

1.倒置字符串 倒置字符串 要将每一个单词逆序输出,首先可以将整个字符串内容都逆序输出,然后再将字符串中的每一个单词再进行逆序。 例如:逆序 i like beijing. 先逆序成:.gnijieb ekil i 再将每个单词逆序: beij…

Matlab实现曲线拟合的最小二乘法

实验条件 实验用例 x0102030405060708090y6867.166.465.664.661.861.060.860.460 实验要求 利用曲线拟合的线性最小二乘法求被逼近函数f(x)在点x55处的近似值,并画出实验数据和直线。 代码实现 X[0,10,20,30,40,50,60,70,80,90]; Y[68,67.1,66.4,65.6,64.6,61.…

达梦数据库8安装教程

第一步:双击驱动 注意:如果双击显示没有驱动,则安装WinCDEmu软件。 第二步:双击setup.exe安装包 第三步:选择时区 第四步:验证key文件 因为我们是免费试用,所以没有key文件,直接下一…

线性回归——最小二乘法

线性回归:自变量和因变量之间是线性关系,例如:h a0a1x1a2x2…anxn。线性回归预测的一般步骤:假设特征变量Xi满足线性关系,然后根据给定的训练数据训练出一个模型,最后通过此模型进行预测。线性回归的根本就…

最小二乘法多项式曲线拟合原理与实现(数学公式详细推导,代码方面详细注释)

最小二乘法概念: 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘…

对「曲线拟合」和「最小二乘法」的个人理解

在工程实践中,经常遇到类似的问题: 我们做了n次实验,获得了一组数据 然后,我们希望知道x和y之间的函数关系。所以我们将其描绘在XOY直角坐标系下,得到下面这么一张点云图: 然后,我们发现,x和y…

最小二乘法实现曲线拟合

说明,本文章的源代码来着于网络,本人已在实际项目中反复使用过,证明没问题。 1.简介 已知曲线上的n个点,可以使用某条曲线去拟合,使得整体上所有的点都逼近曲线,可以使用不同的角度去判断整体逼近&#x…

最小二乘法直线拟合汇总

原文链接:https://www.jianshu.com/p/1c4f3edbaa47 首先最小二乘法是面对不连续的离散点。 它的本质是求某些参数,估计值在整体下可以使误差ε最小。 对于离散点的直线拟合、曲线拟合是在满足误差最小的基础上,得出可以用数学函数式表达的可…

线性回归----最小二乘法

目录 线性回归:就是把离散的数据拟合到一条直线上,获得一个直线方程来近似的描述这些离散的数据 最小二乘法:是用数学公式直接求解线性回归方程的参数的方法。 例: 使用美国汽车油耗数据中的排量disp作为X,油耗MPG作…

曲线拟合——最小二乘拟合(附代码)

曲线拟合——最小二乘拟合(附代码) 曲线拟合1 一元函数的最小二乘拟合1.1 线性回归(直线的最小二乘拟合)1.1.1 直线的最佳拟合方法1.1.2 如何计算1.1.3 误差量化分析 1.2 多项式回归(多项式的最小二乘拟合)…

插值与拟合 (二) : 曲线拟合的线性最小二乘法

目录 1 线性最小二乘法 最小二乘准则 系数 的确定 1.2 函数 的选取 常用的拟合曲线:直线、多项式曲线、双曲线、指数曲线 2 最小二乘法的 Matlab 实现 2.1 解方程组方法 2.2 多项式拟合方法 apolyfit(x0,y0,m) …