這個(gè)問題在normal mapping階段就已經(jīng)出現(xiàn)了,但是效果沒有用parallax mapping后明顯。具體癥狀如下:
當(dāng)攝像機(jī)的z軸在正確角度時(shí),上下左右旋轉(zhuǎn)相機(jī),這時(shí)看起來parallax mapping是正確的。


但當(dāng)攝像機(jī)沿z方向旋轉(zhuǎn)一個(gè)角度后,再上下左右旋轉(zhuǎn)相機(jī),就會(huì)發(fā)現(xiàn)貼圖偏移的方向出現(xiàn)了錯(cuò)誤,貼圖偏移的方向仍然按著攝像機(jī)z軸正確時(shí)的偏移方向偏移。
比如說,攝像機(jī)沿z旋轉(zhuǎn)180度后,上/下旋轉(zhuǎn)相機(jī),物體的模型改變當(dāng)然是隨著顯示俯視/仰視,但是貼圖偏移卻反過來,變成了仰視/俯視;這時(shí)左右旋轉(zhuǎn),貼圖也會(huì)出現(xiàn)相反的左視/右視.....
而攝像機(jī)沿z旋轉(zhuǎn)90度或270度時(shí),上下旋轉(zhuǎn)相機(jī),貼圖偏移卻是沿左視、右視改變
攝像機(jī)沿z旋轉(zhuǎn)其它角度時(shí),這些改變也隨著變化,感覺上就是:貼圖的偏移效果仍然認(rèn)為你的眼睛還在攝像機(jī)z軸的正確角度處看。


過后問了一個(gè)高手,他說轉(zhuǎn)換到tangent space算錯(cuò)了,然后我再把那本《openGL shading language》normal mapping里面vs的轉(zhuǎn)換tangent space代碼直接拿過來,計(jì)算的結(jié)果卻更加不正確,畫面都不會(huì)有動(dòng)態(tài)的偏移了,后來又去復(fù)習(xí)了向量旋轉(zhuǎn)的公式,覺得自己的應(yīng)該還是沒有錯(cuò)誤,又在網(wǎng)上找了別人寫過的代碼試驗(yàn),弄了半天還是不對(duì),現(xiàn)在感覺仍然是原來的代碼最接近正確的,但找不到原因,望高手解決。
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
// 眼坐標(biāo)系下的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;//光相對(duì)于點(diǎn),在眼空間的位置
24
LightPos_pointTanSpace=TBN*pointLightPos;//光相對(duì)于點(diǎn),在點(diǎn)的tangent坐標(biāo)系下的位置
25
26
vec3 eyePos=Pos_eyeSpace*-1.0; //眼睛相對(duì)于點(diǎn),在眼空間的位置
27
EyePos_pointTanSpace=TBN*eyePos;//眼睛相對(duì)于點(diǎn),在點(diǎn)的tangent坐標(biāo)系下的點(diǎn)位置
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) 閱讀(1407)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
圖形學(xué)