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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【延时任务处理、订单失效】RabbitMQ死信队列实现

    【延时任务处理、订单失效】RabbitMQ死信队列实现订单失效问题订单失效问题比较麻烦的地方就是如何能够实时获取失效的订单 对于这种问题一般有两种解决方案 定时任务处理 延时任务处理定时任务处理用户下订单后先生成订单信息 然后将该订单加入到定时任务中 30 分钟后执行 当到达指定时间后检查订单状态 如果未支付则标识该订单失效 定时去轮询数据库 缓存 看订单的状态 这种方式的问题很明显 当集群部署服务器的时候需要做分布式锁进行协调 而且实时性不高 对数据库会产生压力延时任务处理当用户下订单后 将用户的订单的标识全部发送到延时队列中 3

    2025年12月2日
    3
  • mysql数据库优化大全

    mysql数据库优化大全

    2021年11月7日
    50
  • tensorflow指定版本的安装及升级到最新版「建议收藏」

    tensorflow指定版本的安装及升级到最新版「建议收藏」安装anaconda,然后用python的pip可以安装特定版本的tensorflow,如:pipinstalltensorflow-gpu==1.4.0升级到最新:GPU版本:pipinstall–upgradetensorflow-gpuCPU版本:pipinstall–upgradetensorflow如何查看当前tensorflow版本:python……

    2022年6月25日
    35
  • c比python快多少倍_python和c++哪个简单

    c比python快多少倍_python和c++哪个简单国外有测试指出在相同复杂度算法中,C++约比Python快50倍左右。因此Python适合上层应用;C++则适合底层控制。本文介绍如何让C++和Python形成优势互补

    2022年10月5日
    2
  • oracle数据库的字符串拼接符号_oracle将数字转换成字符串

    oracle数据库的字符串拼接符号_oracle将数字转换成字符串现在有一个需求:把字符串中代表日的截取出来,如果小于10就前面拼接一个0;如果大于等于10就不拼接。这里不说怎么截取字符串,怎么判断,主要说拼接字符串。oracle拼接字符串用||,字符串也可以和数字拼接。假设现在截取出来的日是3,那么应该是03,下面的sql没有问题:select0||3fromstudent;…

    2025年11月26日
    3
  • 用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!

    用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!文章目录前言PyQt5界面设计使用QtDesigner绘制界面视频部件插入小技巧解码器下载功能实现trace.moeAPI介绍与视频使用Nuitka打包成exe文件前言喜欢看动漫的朋友们大概都能体会到一个难受的事情,就是在论坛或者群聊里面看到一张动漫截图,很想知道它的出处,但百度搜了一圈却也没有一个可靠结果,就很郁闷。今天就来带大家用Python做一个简单的“以图搜番”小应用。应用本身的实现不是很难的事情,其实就是调用别人的API接口来实现,主要目的还是通过这个案例来学习以下内容:学习如何用Py

    2022年10月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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