Unity3D 去色Shader实现[通俗易懂]

Unity3D 去色Shader实现[通俗易懂]一般为了达到一些特殊的渲染效果会降低纹理所使用的颜色数量,不管是在后处理里实现还是对单个物体实现,思路都是差不多的。在unity里颜色值分量可以看成[0,1]的连续值,但是其实也只能取到256个值,因此可以直接把[0,1]的值无损的映射到256个格子里,然后再根据需要,对这256个格子进行一定的合并,例如[0,9]原来是10种颜色,现在用0代表的颜色代替。[10,19]用10这种颜色代替,依次类推。关键代码,_DiscreteLevel为需要用的颜色数量,我们这里使用向下取整,因此所有落在这个区间内的颜

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一般为了达到一些特殊的渲染效果会降低纹理所使用的颜色数量,不管是在后处理里实现还是对单个物体实现,思路都是差不多的。
在unity里颜色值分量可以看成[0,1]的连续值,但是其实也只能取到256个值,因此可以直接把[0,1]的值无损的映射到256个格子里,然后再根据需要,对这256个格子进行一定的合并,例如[0,9]原来是10种颜色,现在用0代表的颜色代替。[10,19]用10这种颜色代替,依次类推。

关键代码,_DiscreteLevel为需要用的颜色数量,我们这里使用向下取整,因此所有落在这个区间内的颜色都会用区间起始颜色来替换,也可以根据需要使用向上取整,或者取这个区间的中间颜色,甚至使用调色盘来指定颜色。

brightness = floor(brightness * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;         

代码里提供了灰阶和彩色两种方式,灰阶的话就根据像素的亮度来判断所处的区间,彩色的话分别对三个颜色分量做这个操作。

效果如下,原图
请添加图片描述

_DiscreteLevel=4的效果

请添加图片描述

灰阶模式
请添加图片描述

完整代码

Shader "LX/reduceColor"
{ 

Properties
{ 

_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" { 
}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
_DiscreteLevel("DiscreteLevel",range(1,256))=256
_GrayScale("_GrayScale",range(0,1))=0.5
}
SubShader
{ 

Tags
{ 

"RenderType"="Opaque"
}
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
struct Input
{ 

float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
int _DiscreteLevel;
float _GrayScale;
void surf(Input IN, inout SurfaceOutputStandard o)
{ 

float4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
//先计算出亮度
fixed brightness = Luminance(c.rgb);
//灰度离散化
brightness = floor(brightness * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;
fixed3 grayColor = fixed3(brightness, brightness, brightness);
//彩色离散化
fixed r = floor(c.r * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;
fixed g = floor(c.g * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;
fixed b = floor(c.b * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;
fixed3 color = fixed3(r, g, b);
//插值
o.Albedo = lerp(color, grayColor, _GrayScale);
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

另外代码也传到github仓库里了,大家也可以关注一下哦~
我的github

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188826.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 贪吃蛇简单代码_贪吃蛇游戏代码

    贪吃蛇简单代码_贪吃蛇游戏代码$(function(){varbox=$("<divclass=’box’></div>");varArr=[23,22,21];vardirection="right";varnumber=0;varbool=false;//画地图…

  • Activiti6详细教程

    Activiti6详细教程一、为什么选择Activitiactiviti介绍Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。工作流引擎对比二、核心7大接口、28张表7大接口(一)7大接口RepositoryService:提供一系列管理流程部署和流程…

  • 如何把文件复制到桌面_如何把桌面文件放一起

    如何把文件复制到桌面_如何把桌面文件放一起如何解决电脑桌面文件无法删除问题电脑是现在最常用的工具之一,有些用户遇到了桌面文件无法删除问题,想知道如何解决,接下来小编就给大家介绍一下具体的操作步骤。具体如下:1.首先第一步鼠标右键单击桌面,在弹出的菜单栏中根据下图所示,点击【刷新】选项,查看是否删除文件,或者将电脑重新启动后再次删除。2.第二步如果仍然无法删除文件,则打开【计算机】窗口,根据下图所示,依次点击【组织-文件夹和搜索选项】。…

    2022年10月21日
  • 申请软件著作权步骤_著作权包括哪些

    申请软件著作权步骤_著作权包括哪些今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记注册、登录和实名认证首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。注册点击注册按钮进入注册。根据实际情况选择个人或单位,每个个人或单位只能在

  • JAVA基础——接口(全网最详细教程)「建议收藏」

    JAVA基础——接口(全网最详细教程)「建议收藏」Java基础——接口接口概念官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。我的解释:接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组…

  • linux安装在固态盘性能差_固态硬盘格式化不了

    linux安装在固态盘性能差_固态硬盘格式化不了##磁盘尽可能恢复到从未被使用且不包含任何数据的状态检查磁盘Security状态给该磁盘设定一个密码执行secureerase命令上述方法可以尽可能的将硬盘恢复到新盘无数据状态检查磁盘Security状态hdparm-I/dev/sdc检查磁盘security状态,如果frezen直接热插拔,然后再次检查该磁盘状态,如果状态切换到了notfrozen则可以进行secureerase操作给该磁盘设定一个密码使用命令“hdparm–user-masteru–security-s

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号