先上图:
再来是代码:
Shader "Custom/ShaderExample3"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {} //duffuse
_BumpMap("Normal Map", 2D) = "bump" {} //normal
_OcclusionMap("Occlusion", 2D) = "white" {} //AO
_Cube("Reflection Map", Cube) = "" {} //skybox
}
SubShader
{
Pass
{
GLSLPROGRAM
#extension GL_NV_shadow_samplers_cube : enable
uniform sampler2D _MainTex;
uniform sampler2D _BumpMap;
uniform sampler2D _OcclusionMap;
uniform samplerCube _Cube;
uniform vec4 _BumpMap_ST; //代表Tiling和Offset
uniform mat4 _Object2World;
uniform mat4 _World2Object;
uniform vec3 _WorldSpaceCameraPos; //view位置
#ifdef VERTEX
//顶点着色器
attribute vec4 Tangent; //切线
out vec4 texUvCoord;
//tangent basis
out mat3 localSurface2World;
out vec4 worldPos;
void main()
{
mat4 modelMatrix = _Object2World;
mat4 modelMatrixInverse = _World2Object;
//tangent转世界
localSurface2World[0] = normalize(vec3(modelMatrix * vec4(vec3(Tangent), 0.0)));
//normal转世界
localSurface2World[2] = normalize(vec3(vec4(gl_Normal, 0.0) * modelMatrixInverse));
//计算副法线(世界空间内)
localSurface2World[1] = normalize(cross(localSurface2World[2], localSurface2World[0]) * Tangent.w);
//Pos转世界
worldPos = modelMatrix * gl_Vertex;
//UV
texUvCoord = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT
//片元着色器
in vec4 texUvCoord;
//tangent basis
in mat3 localSurface2World;
in vec4 worldPos;
void main()
{
//从normal map里读取normal
vec4 encodedNormal = texture2D(_BumpMap, _BumpMap_ST.xy * texUvCoord.xy + _BumpMap_ST.zw);
//normal转到世界tangent坐标系中
vec3 normalDirection = normalize(localSurface2World * vec3(encodedNormal));
//view dir
vec3 viewDirection = normalize(vec3(worldPos) - _WorldSpaceCameraPos);
vec3 reflectedDir = reflect(viewDirection, normalize(normalDirection));
//天空盒反射颜色(加上normal map)
vec4 skyNormalColor = textureCube(_Cube, reflectedDir);
//diffuse颜色
vec4 diffuseColor = texture(_MainTex, vec2(texUvCoord));
//AO颜色
vec4 occlusionColor = texture(_OcclusionMap, vec2(texUvCoord));
//最终片元颜色
gl_FragColor = skyNormalColor * diffuseColor * occlusionColor * 1.5; //*1.5变亮一点
}
#endif
ENDGLSL
}
}
}