先上图:
这normal map是从3dsmax里面导出的。
注意:normal map在Unity3d中的texture type要保持默认default才行。
下面是代码:
Shader "Custom/ShaderExample2"
{
Properties
{
_BumpMap("Normal Map", 2D) = "bump" {}
_Cube("Reflection Map", Cube) = "" {}
}
SubShader
{
Pass
{
GLSLPROGRAM
#extension GL_NV_shadow_samplers_cube : enable
uniform mat4 _Object2World;
uniform mat4 _World2Object;
uniform vec3 _WorldSpaceCameraPos; //view位置
uniform samplerCube _Cube;
uniform sampler2D _BumpMap;
uniform vec4 _BumpMap_ST; //代表Tiling和Offset
#ifdef VERTEX
//顶点着色器
attribute vec4 Tangent;//切线
//tangent basis
out mat3 localSurface2World;
out vec4 worldPos;
out vec4 textureCoord;
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
textureCoord = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT
//片元着色器
in mat3 localSurface2World;
in vec4 worldPos;
in vec4 textureCoord;
void main()
{
//从normal map里读取normal
vec4 encodedNormal = texture2D(_BumpMap, _BumpMap_ST.xy * textureCoord.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));
gl_FragColor = textureCube(_Cube, reflectedDir);
}
#endif
ENDGLSL
}
}
}