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 Diffuse | Parallax的半透明版本 |
Legacy Shaders/Transparent/Parallax Specular | ParallaxSpec的半透明版本 |
Legacy Shaders/Self-Illumin/Parallax Diffuse | Parallax的自发光版本 |
Legacy Shaders/Self-Illumin/Parallax Specular | ParallaxSpec的自发光版本 |
Legacy Shaders/Reflective/Parallax Diffuse | Parallax的反射版本 |
Legacy Shaders/Reflective/Parallax Specular | ParallaxSpec的反射版本 |