Unity内置Shader解读6——Parallax Diffuse

1.Shader在什么情况下使用

Parallax Diffuse(视差漫反射)引入了视差(高度)贴图的漫反射。使一个平面物体有凹凸效果通常使用法线贴图,而视差(高度)图也会有一些大型游戏厂商采用(据我所知基本上没人用这个)。法线是通过贴图采样直接改变颜色明暗,而视差(高度)贴图则通过移动UV顶点实现视差。因为找不到素材,我也弄不出好看的效果图。

2.Shader的价值(用的多不多),Shader的难度

无用。仅供学习。

3.代码详细注释

Shader "Legacy Shaders/Parallax Diffuse" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _Parallax ("Height", Range (0.005, 0.08)) = 0.02
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _ParallaxMap ("Heightmap (A)", 2D) = "black" {}
    }

    CGINCLUDE
    sampler2D _MainTex;
    sampler2D _BumpMap;
    sampler2D _ParallaxMap;
    fixed4 _Color;
    float _Parallax;

    struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
        float3 viewDir;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        //采样视差贴图的w(a)通道
        half h = tex2D (_ParallaxMap, IN.uv_BumpMap).w;
        //通过ParallaxOffset函数计算视差偏移程度
        //ParallaxOffset函数内容如下
        /*
        // 计算视差凹凸贴图的UV偏移
        inline float2 ParallaxOffset( half h, half height, half3 viewDir )
        {
            //h为视差贴图采样的结果*高度后-高度/2
            //这是Unity官方提供的一种性能高的视差贴图算法,对于视差偏移度小的效果还不错
            //由于是在平面上移动UV点,对于视差偏移度过大的效果并不好
            h = h * height - height/2.0;
            float3 v = normalize(viewDir);
            v.z += 0.42;
            return h * (v.xy / v.z);
        }
        */
        float2 offset = ParallaxOffset (h, _Parallax, IN.viewDir);
        IN.uv_MainTex += offset;
        IN.uv_BumpMap += offset;

        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Alpha = c.a;
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
    }
    ENDCG

    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 500

        CGPROGRAM
        #pragma surface surf Lambert
        #pragma target 3.0
        ENDCG
    }

    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 500

        CGPROGRAM
        #pragma surface surf Lambert nodynlightmap
        ENDCG
    }

    FallBack "Legacy Shaders/Bumped Diffuse"
}

4.Shader编写思路,用到的知识点

ParallaxOffset方法(不重要可略过)
// 计算视差凹凸贴图的UV偏移
        inline float2 ParallaxOffset( half h, half height, half3 viewDir )
        {
            //h为视差贴图采样的结果*高度后-高度/2
            //这是Unity官方提供的一种性能高的视差贴图算法,对于视差偏移度小的效果还不错
            //由于是在平面上移动UV点,对于视差偏移度过大的效果并不好
            h = h * height - height/2.0;
            float3 v = normalize(viewDir);
            v.z += 0.42;
            return h * (v.xy / v.z);
        }

其他的视差贴图

以下这些视差贴图的会跟同类型的其他shader基本雷同,仅增加了视差部分,因为视差贴图用的很少,用官方这种解决方案的更少,因此全都掠过。

路径
Legacy Shaders/Parallax Diffuse漫反射光照下的视差效果
Legacy Shaders/Parallax Specular高光下的视差效果
Legacy Shaders/Transparent/Parallax DiffuseParallax的半透明版本
Legacy Shaders/Transparent/Parallax SpecularParallaxSpec的半透明版本
Legacy Shaders/Self-Illumin/Parallax DiffuseParallax的自发光版本
Legacy Shaders/Self-Illumin/Parallax SpecularParallaxSpec的自发光版本
Legacy Shaders/Reflective/Parallax DiffuseParallax的反射版本
Legacy Shaders/Reflective/Parallax SpecularParallaxSpec的反射版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值