随笔 - 32  文章 - 94  trackbacks - 0
<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(8)

随笔分类

随笔档案

好友连接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

这个问题在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) 阅读(1375) 评论(2)  编辑 收藏 引用 所属分类: 图形学

FeedBack:
# re: 一个有问题的parallax mapping,望高手解决 2009-10-28 13:49 coloriy
帮你顶了  回复  更多评论
  
# re: 一个有问题的parallax mapping,望高手解决 2010-06-19 00:27 陈昱(CY)
问题已经在这一篇解决http://www.cppblog.com/jedi-CY/archive/2010/06/19/118207.html
居然是RenderMonkey的相机导致  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理