ShaderForge学习笔记:Parallax节点(视差节点)

发表于2018-07-18
评论0 2.4k浏览
ShaderForge是一款为Unity所用的、基于节点操作的Shader插件。所以这个ShaderForge学习笔记系列希望可以帮到大家。这一篇就来介绍下Parallax节点(视差节点)的使用。

ShaderForge Parallax节点

一、官方说明


Parallax节点输出的uv是输入的uv经过视差偏移的得到结果,其中视差偏移程由[Hei]指定,[Hei]在计算偏移量时有两个相关参数:深度[Dep]和基准高度[Ref]。
高度图0(白色)对应的部位会凸出来。
高度图1(黑色)对应的部位会凹进去。

二、节点输入

1.UV
物体的uv坐标信息,shaderforge提供一个数据节点[UV Coord.]用于提供物体的uv信息

2.Hei
视差高度值

3. Dep
视差公式的参数之一,默认值为0.05

4. Ref
视差公式的参数之一,默认值为0.5

三、节点输出

1.UV
变换后的uv坐标信息

四、小应用-使用视差贴图实现凹凸效果

使用高度图的R通道值作为[Hei]的输入数据
高度图0(白色)对应的部位会凸出来。
高度图1(黑色)对应的部位会凹进去。

五、Unityshader实现Parallax节点

视差贴图,和法线贴图都是用于制作凹凸效果。与法线贴图不同,视差效果不依赖于光照。
写法:
Shader "Hidden/Parallax"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _GreyTex("GreyScale Texture", 2D) = "white" {}
        _Hei("Hei", Float) = 1.0
        _Dep("Dep", Float) = 0.05
        _Ref("Ref", Float) = 0.5
        //未选中时使用_Hei作为时差值, 选中时视差值从灰度图提取(_Hei失效)
        [Toggle]_USEGREYTEX("USE GreyScale?", INT) = 0
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma shader_feature _USEGREYTEX_ON
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal: NORMAL;
                float4 tangent: TANGENT;
            };
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float3 normalDir : TEXCOORD1;
                float3 tangentDir : TEXCOORD2;
                float3 bitangentDir : TEXCOORD3;
                float4 posWorld : TEXCOORD4;
            };
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.tangentDir = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
                o.bitangentDir = normalize(cross(o.normalDir,o.tangentDir)*v.tangent.w);
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                return o;
            }
            sampler2D _MainTex;
            sampler2D _GreyTex;
            float _Hei;
            float _Dep;
            float _Ref;
            fixed4 frag (v2f i) : SV_Target
            {
                i.normalDir = normalize(i.normalDir);
                float3x3 tangentTransfrom = float3x3(i.tangentDir, i.bitangentDir, i.normalDir);
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 normalDirection = i.normalDir;
                #if _USEGREYTEX_ON
                    _Hei = tex2D(_GreyTex,i.uv).r;
                #endif
                float2 uvNew = (_Dep*(_Hei-_Ref))*mul(tangentTransfrom, viewDirection).xy + i.uv;
                fixed4 col = tex2D(_MainTex, uvNew);
                return col;
            }
            ENDCG
        }
    }
}
效果展示
来自:https://blog.csdn.net/v_xchen_v/article/details/79017689

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引