如果物体表面细节很多,我们可以不断的精细化物体的几何数据,但是这样会产生大量的Lighting & Transformation等计算,
为了实现丰富真实的物体表面,除了贴上一般纹理之外,往往还使用Bump mapping(凹凸纹理)技术。
Bump mapping并没有增加物体的几何复杂度,它只是在计算物体的光照效果时作了“弊”,不使用物体本身的法向量,而是
使用了经过处理的法向量。如果这样的法向量使用normal map,我们可以使用GLSL实现凹凸效果。
首先,因为没有改变对象的几何形状,所以bump mapping的实现是在FS之中进行的,因此光照计算就必须在FS之中进行。
由于normal map之中的法向量是在SURFACE_LOCAL COORDINATE SPACE,所以用于光照计算的光源的方向和视向都
必须变换到同一空间进行光照计算。也就是说,必须使用所谓TBN矩阵的逆矩阵对光源的方向和视向进行变换,转换之后的值
作为varying传入到FS之中。
对于三角形mesh而言,TBN的一种计算方法如下:
Bump mapping的GLSL实现void FindInvTBN(Vertor3f Vertices[3], Vector2f TexCoords[3], Vector3f & InvNormal,
Bump mapping的GLSL实现                  Vector3f 
& InvBinormal, Vector3f & InvTangent) 
  }
上述计算中可以只计算T。
相应的VS如下:
Bump mapping的GLSL实现varying vec3 LightDir;
Bump mapping的GLSL实现varying vec3 EyeDir;
Bump mapping的GLSL实现
Bump mapping的GLSL实现attribute vec3 Tangent;
Bump mapping的GLSL实现
Bump mapping的GLSL实现
void main()


相应的FS如下:
Bump mapping的GLSL实现uniform sampler2D BumpTex;
Bump mapping的GLSL实现uniform sampler2D DecalTex;
Bump mapping的GLSL实现
Bump mapping的GLSL实现varying vec3 LightDir;
Bump mapping的GLSL实现varying vec3 EyeDir;
Bump mapping的GLSL实现
Bump mapping的GLSL实现
void main() 



相关文章: