Shader "Toon/Basic/MultiSteps"
{
    Properties
    {
        // 颜色
        _Color ("Color", Color) = (1, 1, 1, 1)
        _HColor ("Highlight Color", Color) = (0.8, 0.8, 0.8, 1.0)
        _SColor ("Shadow Color", Color) = (0.2, 0.2, 0.2, 1.0)
        
        // 贴图
        _MainTex ("Main Texture", 2D) = "white" { }
        
        // 渐变
        _ToonSteps ("Steps of Toon", range(1, 9)) = 2
        _RampThreshold ("Ramp Threshold", Range(0.1, 1)) = 0.5
        _RampSmooth ("Ramp Smooth", Range(0, 1)) = 0.1
        
        // 镜面
        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
        _SpecSmooth ("Specular Smooth", Range(0, 1)) = 0.1
        _Shininess ("Shininess", Range(0.001, 10)) = 0.2
        
        // 边缘
        _RimColor ("Rim Color", Color) = (0.8, 0.8, 0.8, 0.6)
        _RimThreshold ("Rim Threshold", Range(0, 1)) = 0.5
        _RimSmooth ("Rim Smooth", Range(0, 1)) = 0.1
    }
    
    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        
        CGPROGRAM
        
        #pragma surface surf Toon addshadow fullforwardshadows exclude_path:deferred exclude_path:prepass
        #pragma target 3.0
        // 基础色
        fixed4 _Color;
        // 高光颜色
        fixed4 _HColor;
        // 阴影色
        fixed4 _SColor;
        // 主贴图
        sampler2D _MainTex;
        // 渐变阈值
        float _RampThreshold;
        // 渐变平滑度
        float _RampSmooth;
        // 渐变阶数
        float _ToonSteps;
        // 镜面平滑度
        float _SpecSmooth;
        // 光滑度
        fixed _Shininess;
        // 边缘颜色
        fixed4 _RimColor;
        // 边缘阈值
        fixed _RimThreshold;
        // 边缘光滑度
        float _RimSmooth;
        
        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };
        
        // 线性阶跃
        float linearstep(float min, float max, float t)
        {
            return saturate((t - min) / (max - min));
        }
        
        inline fixed4 LightingToon(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
        {
            half3 normalDir = normalize(s.Normal);
            half3 halfDir = normalize(lightDir + viewDir);
            
            float ndl = max(0, dot(normalDir, lightDir));
            float ndh = max(0, dot(normalDir, halfDir));
            float ndv = max(0, dot(normalDir, viewDir));
            
            // 平滑阶跃
            float diff = smoothstep(_RampThreshold - ndl, _RampThreshold + ndl, ndl);
            float interval = 1 / _ToonSteps;
            // float ramp = floor(diff * _ToonSteps) / _ToonSteps;
            float level = round(diff * _ToonSteps) / _ToonSteps;
            float ramp ;
            if (_RampSmooth == 1)
            {
                ramp = interval * linearstep(level - _RampSmooth * interval * 0.5, level + _RampSmooth * interval * 0.5, diff) + level - interval;
            }
            else
            {
                ramp = interval * smoothstep(level - _RampSmooth * interval * 0.5, level + _RampSmooth * interval * 0.5, diff) + level - interval;
            }
            ramp = max(0, ramp);
            ramp *= atten;
            
            _SColor = lerp(_HColor, _SColor, _SColor.a);
            float3 rampColor = lerp(_SColor.rgb, _HColor.rgb, ramp);
            
            // 镜面
            float spec = pow(ndh, s.Specular * 128.0) * s.Gloss;
            spec *= atten;
            spec = smoothstep(0.5 - _SpecSmooth * 0.5, 0.5 + _SpecSmooth * 0.5, spec);
            
            // 边缘
            float rim = (1.0 - ndv) * ndl;
            rim *= atten;
            rim = smoothstep(_RimThreshold - _RimSmooth * 0.5, _RimThreshold + _RimSmooth * 0.5, rim);
            
            fixed3 lightColor = _LightColor0.rgb;
            
            fixed4 color;
            fixed3 diffuse = s.Albedo * lightColor * rampColor;
            fixed3 specular = _SpecColor.rgb * lightColor * spec;
            fixed3 rimColor = _RimColor.rgb * lightColor * _RimColor.a * rim;
            
            color.rgb = diffuse + specular + rimColor;
            color.a = s.Alpha;
            return color;
        }
        
        // 表面着色器
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = mainTex.rgb * _Color.rgb;
            
            o.Alpha = mainTex.a * _Color.a;
            
            o.Specular = _Shininess;
            o.Gloss = mainTex.a;
        }
        
        ENDCG
        
    }
    FallBack "Diffuse"
}

无光照渲染shader-二次元相关推荐

  1. unity无光照着色器(顶点片元着色器)使用TAA抗锯齿后角色移动时模糊(虚影)解决方案

    1.unity系统内置的着色器,移动时没有模糊, 2.一开始想到的是,顶点着色器一般不处理光照,可能是光照与无光照渲染顺序不同所至 2.渲染管线,内置着色器并不和自定义着色器一起提交GPU, 3.TA ...

  2. 【Bug集锦】shader显示效果一会儿是正常的一会儿是暗淡的(无光照)

    Bug记录: 鼠标一旦对shader操作,或者在模型前滑动,都会造成使用了shader的模型从无光照颜色的正常显示状态变成失去了diffuse和specular,只剩ambient的状态. 因此推断原 ...

  3. 学习游戏渲染(Shader)的用处

     本文在讨论的主题并不限于具体引擎或具体语言,为了说明方便可能会提到Unity的一些内容. 最近渐渐发现很多从事游戏开发的新人,对于学会写Shader似乎总是有几分神往,但一般入了门或者学了一段时间后 ...

  4. OpenGL HDR高动态光照渲染的实例

    OpenGLHDR高动态光照渲染 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include < ...

  5. VR有五种全局光照渲染引擎和各自的优缺点

    来自: 喜欢(有些日子总是令人无法淡忘) 2008-10-20 15:53:26 VR有五种全局光照渲染引擎:  Irradiance map(发光帖图)  Photon map(光子帖图)  QMC ...

  6. geotools 可视化,具有无状态渲染器

    geotools 可视化,具有无状态渲染器 操作地理空间数据不是任何用户都可以做的事情,完成任务的人需要特殊的工具才能使用. geotools 可视化是一个基于开放地理空间联盟 (OGC) 规范的库, ...

  7. 6.Half Lambert光照Diffuse Shader

    简单来说,Lambert定律认为,在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦值成正比(即我们之前使用dot函数得到的结果).Half Lambert最初是由Valve(游戏半条命2使 ...

  8. unity 加载完场景继续加载场景中的物体_Unity光照渲染原理

    先来介绍几个重要概念 直接光照(Direct Lighting):光源直接照射到物体表面所以产生的光照信息,进入Unity主场景加载的就是直接光照 间接光照(Indirect Lighting):光源 ...

  9. UnityShader(三)基础多光照+遮罩Shader

    遮罩的原理很简单,就是用一张存储着遮罩信息的遮罩纹理来计算出片元的遮罩系数,在之前的高光反射上乘于这个系数,就能得到遮罩效果了. Shader "Custom/BaseLight&M ...

最新文章

  1. python安装cvxpy
  2. Exchange服务器系列课程之四--管理Exchange收件人
  3. LNK1136报错解决方法
  4. 【码农本色】用数据解读我的2014
  5. IE下的拖拽Drag事件和示例
  6. 修改MySQL字段为首字母大写
  7. 新浪微博Python客户端接口OAuth2
  8. GDCM:gdcm::Decoder的测试程序
  9. java中的生产者消费者模式详解
  10. exec 与shell_exec的区别
  11. MyBatis中的一级缓存和二级缓存介绍
  12. 矩池云上安装yolov4 darknet
  13. 老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些...
  14. PCAN-Explorer5 基本使用方法
  15. 聚宽API获取沪深300股票
  16. NPM js 包管理器介绍
  17. 编辑为什么建议转投_sci编辑建议转投应该接受吗
  18. UIFont-动态字体
  19. python科学计算和可视化编程
  20. HTML最基础的网页开发语言

热门文章

  1. “网上世博会”带来创新体验,水晶石着力推动“数字展览”应用
  2. 写论文时,画黑白电路图的技巧
  3. linux 重定向 21
  4. 《黑客大曝光:移动应用安全揭秘及防护措施》一2.1 基础移动网络功能
  5. VS2010出现的转换COFF期间失败问题
  6. 全球及中国大健康产业投资潜力与运营价值分析报告2022-2028年
  7. 【修真院小课堂】JWT简单介绍
  8. 今天找压缩算法,看到一段陈年往事
  9. vivo7.0系统手机最完美激活Xposed框架的教程
  10. 【设计相关】UML类图和时序图介绍