立方体贴图

片元着色器利用

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;

}

}

posted @ 2011-06-27 12:30  justin_s  阅读(736)  评论(0编辑  收藏  举报