2014-07-22 31 views
0

我正嘗試使用來自http://antongerdelan.net/opengl/cubemaps.html的GLSL代碼在FxPlug中實現立方體貼圖。我對代碼進行的唯一主要修改是變量名稱更改,並使用gl_Vertex和gl_Normal代替屬性。FxPlug在遠處反轉立方體貼圖

頂點程序片斷

varying vec3 pos_eye; 
varying vec3 n_eye; 

pos_eye = vec3(ViewMatrix * ModelMatrix * gl_Vertex); 
n_eye = vec3(ViewMatrix * ModelMatrix * vec4(gl_Normal, 0.0)); 
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * gl_Vertex; 

片段節目片段

vec3 incident_eye = normalize(pos_eye); 
vec3 norm = normalize(n_eye); 
vec3 reflected = reflect(incident_eye, norm); 
reflected = vec3(InverseViewMatrix * vec4(reflected, 0.0)); 
vec3 cubemapColor = textureCube(cubemap, reflected).rgb; 

當我在模型加載然後插入一個攝像頭,立方體貼圖實際上開始了倒立,但一旦我將相機移開一定距離,我就可以得到正確的結果。有沒有人在實現立方體貼圖之前看到過這個問題?我認爲這是Motion和/或FxPlug如何處理相機的問題。

行動問題的視頻可以在http://youtu.be/Yj85y-VKjCY

在視頻中可以發現,我加載了一個基本的球體,將其放大,並啓用天空盒。球體上的立方體貼圖開始顛倒。當我旋轉球體時,立方體貼圖甚至不會移動(當攝像機移動時忽略整個視頻中的黑色紋理僞影;這似乎是在內存不足或內存不足時發生的)。放大球體後,我得到了更真實的「反射」失真,但立方體貼圖仍然顛倒。 直到我開始縮小到合適的距離時,立方體貼圖才轉變爲它應該看起來的樣子。我注意到,圍繞球體的白色矩形完全可見時,立方體貼圖看起來正確。

我將不勝感激關於如何解決這個問題的任何建議。提前致謝!

回答

0

經過進一步調查,我發現立方體圖失真是由錯誤計算的反射方向造成的。事實證明,相機的「實際」位置在正Z方向上約爲2000單位。爲了解決這個差異,我在頂點着色器中創建了一個與原始圖像相似的單獨視圖矩陣,但是我從單獨視圖矩陣的第15個條目(即「位置」列的Z元素)中減去2000。

mat4 AdjustedViewMatrix = ViewMatrix; 
AdjustedViewMatrix[3][2] += -2000.0; 

pos_eye = vec3(AdjustedViewMatrix * ModelMatrix * gl_Vertex); 

雖然我仍然使用原來的視圖矩陣,用於存儲GL_POSITION,使用經調整的視圖矩陣,用於計算所述變化眼空間位置阻止立方圖失真當接近物體。