【shaderforge学习笔记】 Parallax节点(视差节点)

时间:2022-05-13 03:47:05

shaderforge Parallax节点

一、官方说明

【shaderforge学习笔记】 Parallax节点(视差节点)

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

二、节点输入

1.UV

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

2.Hei

视差高度值
【shaderforge学习笔记】 Parallax节点(视差节点)

3. Dep

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

4. Ref

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

三、节点输出

1.UV

变换后的uv坐标信息

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

使用高度图的R通道值作为[Hei]的输入数据
高度图0(白色)对应的部位会凸出来。
高度图1(黑色)对应的部位会凹进去。
【shaderforge学习笔记】 Parallax节点(视差节点)

五、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
}
}
}

效果展示
【shaderforge学习笔记】 Parallax节点(视差节点)

参考:
Parallax Mapping