ShaderForge学习笔记:Parallax节点(视差节点)
发表于2018-07-18
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