一个有问题的parallax mapping,望高手解决

一个有问题的parallax mapping,望高手解决

这个问题在normal mapping阶段就已经出现了,但是效果没有用parallax mapping后明显。具体症状如下:

当摄像机的z轴在正确角度时,上下左右旋转相机,这时看起来parallax mapping是正确的。
一个有问题的parallax mapping,望高手解决_第1张图片
一个有问题的parallax mapping,望高手解决_第2张图片
但当摄像机沿z方向旋转一个角度后,再上下左右旋转相机,就会发现贴图偏移的方向出现了错误,贴图偏移的方向仍然按着摄像机z轴正确时的偏移方向偏移。

比如说,摄像机沿z旋转180度后,上/下旋转相机,物体的模型改变当然是随着显示俯视/仰视,但是贴图偏移却反过来,变成了仰视/俯视;这时左右旋转,贴图也会出现相反的左视/右视.....
而摄像机沿z旋转90度或270度时,上下旋转相机,贴图偏移却是沿左视、右视改变
摄像机沿z旋转其它角度时,这些改变也随着变化,感觉上就是:贴图的偏移效果仍然认为你的眼睛还在摄像机z轴的正确角度处看。
一个有问题的parallax mapping,望高手解决_第3张图片
一个有问题的parallax mapping,望高手解决_第4张图片

过后问了一个高手,他说转换到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}


 

你可能感兴趣的:(一个有问题的parallax mapping,望高手解决)