Unity自定义后处理——校色

news2024/11/26 18:42:42

Unity自定义校色后处理

  大家好,我是阿赵。
  之前介绍了一些后处理的做法,包括了PostProcessing和CommandBuffer。其实如果我们只是实现一些比较单一的全屏效果,也没必要搞那么复杂,直接在OnRenderImage里面写Graphics.Blit就可以了。接下来的几篇文章都会介绍这种简单直接的后处理实现方式。
  这一期先来讲最简单的校色。我还是拿这个模型作为原始画面。
在这里插入图片描述

一、饱和度

  实现饱和度的调整,原理其实是先取一个灰度颜色,然后再用这个灰度的颜色和当前的颜色做lerp插值。

		//饱和度
float lumin = dot(col, float3(0.22f, 0.707f, 0.071f));
col = lerp(lumin, col, _Saturation);

  其中 float3(0.22f, 0.707f, 0.071f)这个灰度可以根据你自己的需要去调整。然后声明一个_Saturation变量,用于控制饱和度的插值。
在这里插入图片描述

_Saturation默认是1,即是画面的原始颜色。当我们增大_Saturation,让_Saturation大于1时,可以看到画面的饱和度变高了。
在这里插入图片描述

当我们减少_Saturation值,让它接近0时,画面就变成了灰度。
在这里插入图片描述

原则上_Saturation应该是大于等于0的,但如果我们把_Saturation的可调范围包含负数时,负数的效果就会变成反色了。

二、对比度

  对比度的原理和饱和度有点类似,但它不再是那灰度作为0插值时的颜色,而是用一个中间色

		//对比度
		float3 midPoint = float3(0.5, 0.5, 0.5);
	col.rgb = lerp(midPoint, col.rgb, _Contrast);
  其中的_Contrast变量是控制对比度的值。

在这里插入图片描述当_Contrast值变大时,对比度就变大了。
在这里插入图片描述

由于后处理是作用在整个画面的,所以当我们调整_Contrast时,连着背景的颜色一起,整个画面的对比度就变低。
在这里插入图片描述

和饱和度一样,假如我们把_Contrast的取值范围包含负数,就可以做这种反相的效果。

三、色调

  要调整颜色的色调,我们要转换一下,把RGB颜色转换成HSV颜色模型。然后再对其中的Hue进行调整,调整完之后,再调整回到RGB颜色。
RGB和HSV的转换

float3 HSVToRGB(float3 c)
{
	float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
	float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
	return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y);
}


float3 RGBToHSV(float3 c)
{
	float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
	float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
	float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
	float d = q.x - min(q.w, q.y);
	float e = 1.0e-10;
	return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}

调整色调

//色调
float3 hsvCol = RGBToHSV(col.rgb);
hsvCol.x = hsvCol.x + _HueShift;
col.rgb = HSVToRGB(hsvCol);

其中_HueShift变量是控制色调的变化
在这里插入图片描述
在这里插入图片描述

调整_HueShift,可以看到画面的色调在改变。

四、明度

  明度调整是最简单的了,直接RGB颜色乘以一个变量就行

//明度
col.rgb *= _Light;

在这里插入图片描述

由于后处理针对的是整个画面,所以调整明度,会整个画面一起变化。
在这里插入图片描述

用Photoshop时,我们很喜欢亮度和对比度一起调整,这里的各种效果都是可以互相配合使用的。亮度和对比度一起调整,就变成这种效果。
在这里插入图片描述

五、完整代码

1、C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AdjustColor : MonoBehaviour
{
    private Material colorMat;
    [Range(-5, 5)]
    public float saturation = 1;
    [Range(-5, 5)]
    public float contrast = 1;
    [Range(0, 1)]
    public float hueShift = 0;
    [Range(0, 5)]
    public float lightVal = 1;
    void Start()
    {
        

    }

    void Update()
    {
        
    }

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        AjustColor(source, destination);        
    }

    private bool AjustColor(RenderTexture source, RenderTexture destination)
    {
        if (colorMat == null)
        {
            colorMat = new Material(Shader.Find("Hidden/AzhaoAjustColor"));
        }
        if (colorMat == null || colorMat.shader == null || colorMat.shader.isSupported == false)
        {
            return false;
        }
        colorMat.SetFloat("_Saturation", saturation);
        colorMat.SetFloat("_Contrast", contrast);
        colorMat.SetFloat("_HueShift", hueShift);
        colorMat.SetFloat("_Light", lightVal);

        Graphics.Blit(source, destination, colorMat, 0);
        return true;
    }
}

2、Shader

Shader "Hidden/AzhaoAjustColor"
{
	CGINCLUDE
#include "UnityCG.cginc"

	sampler2D _MainTex;
	float4 _MainTex_TexelSize;
	float _Saturation;
	float _Contrast;
	float _HueShift;
	float _Light;
	float3 HSVToRGB(float3 c)
	{
		float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
		float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
		return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y);
	}


	float3 RGBToHSV(float3 c)
	{
		float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
		float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
		float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
		float d = q.x - min(q.w, q.y);
		float e = 1.0e-10;
		return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
	}

	half4 fragColorAjust(v2f_img i) : SV_Target
	{
		half4 col = tex2D(_MainTex, i.uv);
		//饱和度
		float lumin = dot(col, float3(0.22f, 0.707f, 0.071f));
		col = lerp(lumin, col, _Saturation);

		//对比度
		float3 midPoint = float3(0.5, 0.5, 0.5);
		col.rgb = lerp(midPoint, col.rgb, _Contrast);

		//色调
		float3 hsvCol = RGBToHSV(col.rgb);
		hsvCol.x = hsvCol.x + _HueShift;
		col.rgb = HSVToRGB(hsvCol);

		//明度
		col.rgb *= _Light;

		return col;
	}


	ENDCG
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Saturation("Saturation",Range(-5,5)) = 1
		_Contrast("Contrast",Range(-5,5)) = 1
		_HueShift("HueShift",Range(0,1)) = 0
		_Light("Light",Range(0,5)) = 1
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always
		//0校色
        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment fragColorAjust            

            
            ENDCG
        }
    }
}

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

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

相关文章

最近很火的 LangChain 你了解吗

最近 ChatGPT 很火,AIGC 很火,各类国产化 AI 很火。周边的 AI 工具集、框架也很火。各类新词也层出不穷。今天和大家学习和分享的是重量级新选手 LangChain。 一、什么是 LangChain LangChain 是一个 2023 年 1 月(v0.0.64)在 G…

网页聊天室测试

1.项目介绍: 该项目是一个基于网页的聊天室应用,具有用户注册、登录、会话列表、好友列表、发送消息等功能。下面是更详细的项目介绍: 用户注册和登录功能:用户可以通过输入用户名和设置密码来注册新账户,在注册过程中…

实施工程师需要了解的mysql知识

一、前言 做为实施工程师,在现场有时候是需要协助开发人员做一些简单的sql查询、更新动作的,不需要多复杂,下面就简单介绍下mysql的安装以及举一些最简单常用的sql用例。 二、安装mysql 2.1 下载安装包 第一步:在百度搜索"…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

使用python进行AI选股之同花顺问财

通过问财python库&#xff0c;可以输入中文就能获取AI选股结果&#xff0c;而不需要写很多代码来进行股票选取&#xff0c;如上图就是输入中文”均线多头排列的股票”获取的结果。本文主要介绍问财python库的选股功能和使用步骤。 什么是问财python库 同花顺i问财是同花顺旗下…

Echarts 定制化日历图

目录 改造一&#xff08;变化X轴、Y轴label&#xff09;&#xff1a; 改造二&#xff08;单元格、图例改造&#xff09;&#xff1a; 改造三&#xff08;tooltip、细节优化&#xff09;&#xff1a; 最近在做可视化&#xff0c;发现日历图挺有意思&#xff0c;分享一波吧&am…

SpringBoot项目打包Docker镜像

1、创建springboot项目&#xff0c;并在根目录新建Dockerfile文件 Dockerfile文件内容 FROM adoptopenjdk/openjdk8:jre8u-nightly ADD target/test-k8s-0.0.1-SNAPSHOT.jar test-k8s-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java","-jar","/test-k8s-0.0.…

Python编程——字符串的拼接

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 前言 本文将讲解字符串的拼接与使用%进行拼接。 目录 ​编…

(二)Qt下多线程实现多个海康工业相机内触发采集回调取流显示

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a;&#xff08;一&#xff09;Qt下实现多个海康工业相机内触发采集回调取流显示 第二章&#xff1a;&#xff08;二&#xff09;Qt下多线程实现多个海康工业相机内触发采集回调取流显示 文章目…

单例模式之常见模式详解

单例模式之常见模式详解 单例模式的定义单例模式的分类饿汉模式懒汉模式 单例模式的主要特点单例模式的应用场景总结 单例模式的定义 单例模式是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 在单例模式中&#xff0c;类…

2023需求最高的编程语言:Python、JavaScript和Java

科技招聘平台 CodinGame 和 CoderPad 最新发布了一份 2023 年科技行业招聘报告&#xff0c;基于对 14000 名专业人士的调查&#xff0c;对 2023 年科技行业招聘人员和求职者可能面临的情况进行了深入分析。其中一些关键亮点包括&#xff1a; 59% 的开发人员没有计算机科学方面的…

吴恩达机器学习笔记-week2

第2周 目录 第2周 四、多变量线性回归(Linear Regression with Multiple Variables) 4.1 多维特征4.2 多变量梯度下降4.3 梯度下降法实践1-特征缩放4.4 梯度下降法实践2-学习率4.5 特征和多项式回归4.6 正规方程4.7 正规方程及不可逆性(可选) 四、多变量线性回归(Linear Regres…

docker的安装以及常用命令详解

目录 一、docker简介 二、docker安装 三、常用命令 1、显示 Docker 版本信息 2、显示 Docker 系统信息&#xff0c;包括镜像和容器数 3、帮助 四、镜像管理 1、列出镜像 2、获取一个新的镜像 3、查找镜像 4、删除镜像 5、镜像导入与导出 五、容器生命周期 1、运行…

Bring Your Data!Self- supervised Evolution of Large Language Models

Bring Your Data&#xff01;Self- supervised Evolution of Large Language Models IntroductionMethod参考 Introduction 这篇论文提出了一种自监督的评估方式来衡量大型语言模型的能力和局限性。常规的基于数据集的评估方式存在一些缺点: 需要不断新建数据集。存在数据集和…

外包软件定制开发中时间和进度管理

引言 时间和进度管理是外包软件定制开发项目中至关重要的方面。有效地管理时间和进度可以确保项目按计划顺利进行&#xff0c;减少延误和风险&#xff0c;从而提高交付的可靠性和质量。然而&#xff0c;由于外包团队和客户位于不同的地理位置和时区&#xff0c;时间和进度管理…

[MySQL]MySQL索引

[MySQL]MySQL索引 文章目录 [MySQL]MySQL索引1. 索引的概念2. 认识磁盘磁盘的内部结构磁盘中的一个盘片结构定位扇区磁盘随机访问与连续访问 3. MySQL与磁盘交互的基本单位4. 建立共识5. 索引的理解创建测试表进行测试理解单个page理解多个page页目录其他的数据结构的问题聚簇索…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud角色与权限

目录 组织和项目 角色和权限 访问权限等级 文档推荐 Zilliz Cloud 提供访问控制。您可以灵活管理用户,为用户分配不同角色,授予用户不同的集群资源访问和操作权限。无权限的用户无法访问特定资源。 组织和项目 Zilliz Cloud 通过组织和项目实现访问控制和资源分离。 …

PostgreSQL数据库的部署与优化

文章目录 一.PostgreSQL数据库1.PostgreSQL数据库的概念1.1 PostgreSQL 的核心概念 2.PostgreSQL特点3.PostgreSQL的作用4.PostgreSQL的应用场景5.PostgreSQL、mysql、oracle的对比 二.Linux系统安装PostgresSQL&#xff08;Centos7&#xff09;1.更新yun源2.安装PostgreSQL2.1…

【消息队列设计总结】RabbitMQ、Kafka、RocketMQ对比之运行架构

目录 1 RabbitMQ 1.1 工作原理 1.2 名词解释 1.3 交换机的几种类型 2 Kafka 2.1 工作原理 2.2 基本概念 3 RocketMQ 3.1 工作原理 3.2 基本概念 4 RabbitMQ & Kafka & RocketMQ的差异 5 参考文档 1 RabbitMQ 1.1 工作原理 1.【消息生产】生产者&#xff0…

润本股份提交注册:拟募资约9亿元,赵贵钦、鲍松娟夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;润本生物技术股份有限公司&#xff08;下称“润本股份”&#xff09;在上海证券交易所递交招股书&#xff08;注册稿&#xff09;。据贝多财经了解&#xff0c;润本股份于2023年3月递交上市申请材料&#xff0c;准备在上海证券交易所…