前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3D 去色Shader实现[通俗易懂]

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

作者头像
全栈程序员站长
发布2022-11-10 15:42:00
8520
发布2022-11-10 15:42:00
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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

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

代码语言:javascript
复制
brightness = floor(brightness * 256 / (256 / _DiscreteLevel)) * (256 / _DiscreteLevel) / 256;         

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

效果如下,原图

请添加图片描述
请添加图片描述

_DiscreteLevel=4的效果

请添加图片描述
请添加图片描述

灰阶模式

请添加图片描述
请添加图片描述

完整代码

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月27日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档