片元着色器利用
vec4 texColor = textureCube(myCube, texCoord);
9.12.1 反射贴图
即,有部分光来自反射方向
9.12.2 折射
即,有部分光来自折射方向(在小于临界角时)
散射光线集中在折射光线方向附近,因此折射模型中可能还包括一项与t.v成正比的项,同样可以用中值来简化
9.12.3 法线贴图
9.13 凹凸映射
9.13.1原理
给每个点一个法向上的微小扰动,有多种方法
p = p’ + d(u,v)*n (1)
p’处的法向量n’ = p’_u x p’_v (2)
从(1)式求导,得 p’_u , p’_v,
再由(2) 得n’
组成 [t, b, m]
则只需给出 \partial d/ \partial u 及 \partial d / \partial v, 可用(纹理图像)差分代替
9.13.2 高度场与凹凸映射
对多边形模型,在模型或对象桂圆里利用高度场时行凹凸映射。假设某扁平表面处于z = 0,则凹凸效果为移位结果:z = d(x,y)
用x y 方向上采样点的间隔近似法线扰动
9.13.3 凹凸映射与片元着色器
因为需要为每个片元计算法线,在固定功能流水线中不容易实现。对片元着色器,在处理每个片元时可修改法线。
其中一种方法:每处理一个片元时,调用扰动函数
另一种,预先计算扰动量,存放在一个纹理贴图里
还有一点,要注意计算所需要的空间
9.13.4示例
在纹理坐标系中。
varing vec3 lightv;
varying vec3 viewv;
attribute vec tangento;
void main()
{
gl_Position = gl_ModelViewmatrix * gl_Vertex;
vec3 viewe = vec3()gl_ModelViewMatrix*gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
vec3 lighte = normalize(vec3(gl_LightSource[0].position) – viewe);
vec3 normal = normalize(gl_NormalMatrix* gl_Normal);
vec3 tangent = normalize(gl_NormalMatrix*tangento);
vec3 binormal = cross(normal, tangent);
lightv.x = dot(tangent, lighte.xyz);
lightv.y = dot(binormal, lighte.xyz);
lightv.z = dot(normal, lighte.xyz);
viewv.x = …
viewv.y = …
viewv.z = …
lightv = normalize(lightv);
viewv = normalize(viewv);
}
varying vec3 lightv;
varying vec3 viewv;
uniform sampler2D texMap;
uniform sampler 2D normalMap;
void main()
{
vec3 Light = normalize(lightv);
vec4 texColor = texture2D(texMap,gl_texCoord[0].st);
vec3 normal = 2 * (texture2D(normalMap,gl_TexCoord[0].st).rgb – 0.5);
gl_FragColor = max(dot(light, normal),0.0) * texColor;
}
}