这个问题在normal mapping阶段就已经出现了,但是效果没有用parallax mapping后明显。具体症状如下:
当摄像机的z轴在正确角度时,上下左右旋转相机,这时看起来parallax mapping是正确的。
但当摄像机沿z方向旋转一个角度后,再上下左右旋转相机,就会发现贴图偏移的方向出现了错误,贴图偏移的方向仍然按着摄像机z轴正确时的偏移方向偏移。
比如说,摄像机沿z旋转180度后,上/下旋转相机,物体的模型改变当然是随着显示俯视/仰视,但是贴图偏移却反过来,变成了仰视/俯视;这时左右旋转,贴图也会出现相反的左视/右视.....
而摄像机沿z旋转90度或270度时,上下旋转相机,贴图偏移却是沿左视、右视改变
摄像机沿z旋转其它角度时,这些改变也随着变化,感觉上就是:贴图的偏移效果仍然认为你的眼睛还在摄像机z轴的正确角度处看。
过后问了一个高手,他说转换到tangent space算错了,然后我再把那本《openGL shading language》normal mapping里面vs的转换tangent space代码直接拿过来,计算的结果却更加不正确,画面都不会有动态的偏移了,后来又去复习了向量旋转的公式,觉得自己的应该还是没有错误,又在网上找了别人写过的代码试验,弄了半天还是不对,现在感觉仍然是原来的代码最接近正确的,但找不到原因,望高手解决。
RenderMonkey源文件:parallaxMapping.rar
有问题的代码:
1uniform vec3 LightPosition;
2
3varying vec3 EyePos_pointTanSpace;
4varying vec3 LightPos_pointTanSpace;
5
6attribute vec3 Tangent;
7//uniform vec3 Tangent;
8
9void main()
10{
11 gl_Position = ftransform();
12 gl_TexCoord[0] = gl_MultiTexCoord0;
13
14 vec3 eyepos=(0,0,0);
15 vec3 Pos_eyeSpace = vec3(gl_ModelViewMatrix * gl_Vertex);
16
17 // 眼坐标系下的TBN
18 vec3 n = normalize(gl_NormalMatrix * gl_Normal);
19 vec3 t = normalize(gl_NormalMatrix * Tangent);
20 vec3 b = cross(n, t);
21 mat3 TBN = mat3(t, b, n);
22
23 vec3 pointLightPos=LightPosition-Pos_eyeSpace;//光相对于点,在眼空间的位置
24 LightPos_pointTanSpace=TBN*pointLightPos;//光相对于点,在点的tangent坐标系下的位置
25
26 vec3 eyePos=Pos_eyeSpace*-1.0; //眼睛相对于点,在眼空间的位置
27 EyePos_pointTanSpace=TBN*eyePos;//眼睛相对于点,在点的tangent坐标系下的点位置
28
29
30}
1uniform sampler2D BumpTex;
2uniform sampler2D BitMapTex;
3uniform float HeightFactor;
4
5varying vec3 EyePos_pointTanSpace;
6varying vec3 LightPos_pointTanSpace;
7
8void main()
9{
10 float height = (texture2D(BumpTex, gl_TexCoord[0].xy)).a;//获得高度
11 height =(height *2.0)-1.0;
12
13 vec3 LightDir=normalize(LightPos_pointTanSpace);//光方向
14 vec3 viewVec=normalize(EyePos_pointTanSpace);//眼睛方向
15
16 vec2 texCoord2=gl_TexCoord[0].xy+viewVec.xy*height*HeightFactor;
17
18 vec3 BumpNorm=vec3(texture2D(BumpTex, texCoord2));
19
20 BumpNorm=(BumpNorm *2.0)-1.0;
21
22 vec4 Co=(texture2D(BitMapTex, texCoord2));
23
24 float diffuse = max(dot(BumpNorm, LightDir), 0.0);
25
26
27 vec3 reflectVec=reflect(-LightDir,BumpNorm);
28
29 float spec = max(dot(reflectVec, viewVec), 0.0);//反射光
30 spec = pow(spec, 8.0);
31
32 float color=spec+diffuse;
33
34 gl_FragColor = Co*color;//vec4(color,spec,0.0, 1.0);
35}
posted on 2009-10-24 13:36
陈昱(CY) 阅读(1394)
评论(2) 编辑 收藏 引用 所属分类:
图形学