Unity Shader渐变纹理(3D动漫风格纹理)

Unity Shader渐变纹理(3D动漫风格纹理),第1张

一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理其实可以用于存储任何表面属性。一种常见的用法就是使用渐变纹理来控制漫反射光照的结果。在之前计算漫反射光照是,我们都是使用表面法线和光照方向的点积结果与材质的反射率相乘来得到表面漫反射效果。
这种技术最早在论文《A Non_Photorealistic Lighting Model For AutoTechnical Illustation》中被提出,在这篇论文中,作者提出了一种基于冷到暖色调的着色技术,用来得到一种插画风格的渲染效果。使用这种技术,可以保证物体的轮廓相比于之前使用的传统漫反射光照技术更加明显,而且能够提供更多色调变化。现在,很多卡通风格的渲染中都使用了这种技术。
我们先在新建的场景里去掉天空盒,去掉天空盒的方法在这:去掉天空盒的方法在这在此文章最底下
再新建以个材质,最后再新建一个Shader,把这个Shader赋给刚刚建好的材质。

我们打开Shader开始编写代码

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Chapter7-RampTexture"
{
    Properties
    {
        _Color ("Color", Color) = (1, 1, 1, 1)
        _RampTex ("Ramp Tex", 2D) = "white" {}
        _Specular ("Specular", Color) = (1, 1, 1, 1)
        _Gloss ("GLoss", Range(8.0, 256)) = 20
    }
    SubShader
    {
    Pass
    {
        Tags { "LightMode"="ForwardBase" }

        CGPROGRAM
        
        #pragma vertex vert 
        #pragma fragment frag

        #include "Lighting.cginc"

        fixed4 _Color;
        sampler2D _RampTex;
        float4 _RampTex_ST;
        fixed4 _Specular;
        float _Gloss;

        struct a2v
        {
            float4 vertex : SV_POSITION;
            float3 normal : NORMAL;
            float4 texcoord : TEXCOORD0;
        };

        struct v2f
        {
            float4 pos : SV_POSITION;
            float3 worldNormal : TEXCOORD0;
            float3 worldPos : TEXCOORD1;
            float2 uv : TEXCOORD2;
        };

        v2f vert (a2v v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);

            o.worldNormal = UnityObjectToWorldNormal(v.normal);

            o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);

            return o;
        }

        fixed4 frag(v2f i) : SV_Target 
        {
            fixed3 worldNormal = normalize(i.worldNormal);
            fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

            fixed halfLambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
            fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Color.rgb;

            fixed3 diffuse = _LightColor0.rgb * diffuseColor;

            fixed3 viewDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
            fixed3 halfDir = normalize(worldLightDir + viewDir);
            fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);

            return fixed4(ambient + diffuse + specular, 1.0);

        }

        ENDCG
    }
    }
    FallBack "Specular"
}

再将书中提供的渐变资源拖到材质中

需要注意的是,我们需要把渐变纹理贴图的Warp Mode设为Clamp模式,以防止对纹理进行采样时由于浮点数精度二照成问题。

效果图如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/739476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存