这个问题在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
有问题的代码:
1
uniform vec3 LightPosition;
2
3
varying vec3 EyePos_pointTanSpace;
4
varying vec3 LightPos_pointTanSpace;
5
6
attribute vec3 Tangent;
7
//uniform vec3 Tangent;
8
9
void 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
}
1
uniform sampler2D BumpTex;
2
uniform sampler2D BitMapTex;
3
uniform float HeightFactor;
4
5
varying vec3 EyePos_pointTanSpace;
6
varying vec3 LightPos_pointTanSpace;
7
8
void 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) 阅读(1400)
评论(2) 编辑 收藏 引用 所属分类:
图形学