法线映射:
世界/模型空间的法线贴图:直接得到模型空间法线,便于计算,一般只能用于特定模型
切线空间的法线贴图:可以复用。
//使用切线空间法线纹理,在切线空间计算光照
Shader "may/normal map"
{
Properties
{
_BaseColor ("基础色RGB", 2D) = "white"{}
_normalMap ("法线贴图", 2D) = "bump" {}
_AOmap ("环境光遮蔽", 2D) = "white"{}
}
SubShader
{
Tags { "Queue" = "Geometry" "RenderType"="Opaque" "IgnoreProjector" = "True" "DisableBatching" = "False" }
LOD 100
Pass
{
Name "Normal Map"
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
sampler2D _normalMap;
float4 _normalMap_ST;
sampler2D _BaseColor;
float4 _BaseColor_ST;
sampler2D _AOmap;
float4 _AOmap_ST;
struct a2v
{
float4 vertex:POSITION;
float4 uv:TEXCOORD;
float3 normalMS:NORMAL;
float4 tangentMS:TANGENT;
};
struct v2f
{
float4 pos:SV_POSITION;
float2 uvBC:TEXCOORD;
float2 uvNor:TEXCOORD5;
float2 uvAO:TEXCOORD6;
fixed3 viewDirTS:TEXCOORD1;
fixed3 lightDirTS:TEXCOORD2;
LIGHTING_COORDS(3, 4)
//SHADOW_COORDS(3)
//float4 posWS:TEXCOORD6;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//float4 posWS = mul(unity_ObjectToWorld, v.vertex);
o.uvBC = TRANSFORM_TEX(v.uv, _BaseColor);
o.uvNor = TRANSFORM_TEX(v.uv, _normalMap);
o.uvAO = TRANSFORM_TEX(v.uv, _AOmap);
float3 viewDirMS = normalize(ObjSpaceViewDir(v.vertex));
float3 lightDirMS = normalize(ObjSpaceLightDir(v.vertex));
float3 BinormalMS = cross(v.normalMS, v.tangentMS.xyz) * v.tangentMS.w;
float3x3 ModelToTangent =
{
v.tangentMS.xyz,
BinormalMS,
v.normalMS
};
o.viewDirTS = normalize( mul(ModelToTangent, viewDirMS) );
o.lightDirTS = normalize( mul(ModelToTangent, lightDirMS) );
TRANSFER_VERTEX_TO_FRAGMENT(o)
//TRANSFER_SHADOW(o)
//o.posWS = mul(unity_ObjectToWorld, v.vertex);
return o;
}
fixed4 frag(v2f i):SV_TARGET0
{
fixed3 normalTex = UnpackNormal(tex2D(_normalMap, i.uvBC));
fixed3 baseColorTex = tex2D(_BaseColor, i.uvNor);
fixed3 AO = tex2D(_AOmap, i.uvAO);
//ambient
fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * AO;
//diffuse
fixed lambert = saturate(dot(normalTex, i.lightDirTS));
fixed3 diffuseColor = _LightColor0 *baseColorTex * lambert;
fixed atten = LIGHT_ATTENUATION(i);
//UNITY_LIGHT_ATTENUATION(atten, i, i.posWS);
return fixed4( ambientColor + diffuseColor * atten, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}
陡峭视差映射 Steep Parallax Mapping
Shader "may/Steep"
{
Properties
{
_BaseColor ("BaseColor RGB", 2D) = "white" {}
_DepthMap ("DepthMap 0-1", 2D) = "white" {}
_AOmap ("AO", 2D) = "white" {}
_LayNum ("LayNum", Range(2,100)) = 5
_BumpScale ("BumpScale", Range(0.0,0.1)) = 0.01
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
Name "陡峭视差映射"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
sampler2D _BaseColor;
float4 _BaseColor_ST;
sampler2D _DepthMap;
float4 _DepthMap_ST;
sampler2D _AOmap;
float4 _AOmap_ST;
float _LayNum;
fixed _BumpScale;
struct a2v
{
float4 vertex:POSITION;
float4 uv:TEXCOORD;
float3 normalMS:NORMAL;
float4 tangentMS:TANGENT;
};
struct v2f
{
float4 pos:SV_POSITION;
float2 uvBC:TEXCOORD;
float2 uvDepth:TEXCOORD1;
float2 uvAO:TEXCOORD2;
fixed3 viewDirTS:TEXCOORD3; //在切线空间空间计算 此时x和y分量 与切线空间的x y分量同向。
SHADOW_COORDS(4)
float4 posWS:TEXCOORD5;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.posWS = mul(unity_ObjectToWorld, v.vertex);
o.uvBC = TRANSFORM_TEX(v.uv, _BaseColor);
o.uvDepth = TRANSFORM_TEX(v.uv, _DepthMap);
o.uvAO = TRANSFORM_TEX(v.uv, _AOmap);
float3 viewDirMS = normalize(ObjSpaceViewDir(v.vertex));
float3 lightDirMS = normalize(ObjSpaceLightDir(v.vertex));
float3 BinormalMS = cross(v.normalMS, v.tangentMS.xyz) * v.tangentMS.w;
float3x3 ModelToTangent =
{
v.tangentMS.xyz,
BinormalMS,
v.normalMS
};
o.viewDirTS = normalize( mul(ModelToTangent, viewDirMS) );
TRANSFER_SHADOW(o)
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//diffuse
fixed stepDepth = 1.0 / _LayNum;
fixed depth = 0;
fixed2 deviatedUV = i.uvDepth;
while( tex2Dlod(_DepthMap, float4(i.uvDepth, 0, 1)).x > depth)
{
depth += stepDepth;
deviatedUV += i.viewDirTS.xy / i.viewDirTS.z * stepDepth * _BumpScale;
}
fixed3 diffuseColor = tex2D(_BaseColor, deviatedUV);
//ambient
fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * tex2D(_AOmap, deviatedUV);
UNITY_LIGHT_ATTENUATION(atten, i, i.posWS);
return fixed4( ambientColor + diffuseColor * atten, 1);
}
ENDCG
}
}
FallBack "Specular"
}