2015-04-23 54 views
0

我正在開發OpenGL應用程序,並且遇到實現立方體貼圖反射着色器的問題:反射圍繞對象旋轉相機,從任何角度來看都是一樣的。GLSL立方體貼圖反射着色器

這裏是我的頂點着色器:

in vec4 in_Position; 
in vec4 in_Normal; 

out vec3 ws_coords; 
out vec3 normal; 

mat4 uniform_ModelViewProjectionMatrix; 
mat4 uniform_ModelViewMatrix; 
mat4 uniform_ModelMatrix; 
mat3 uniform_NormalMatrix; 
vec3 uniform_CameraPosition; 
... 
ws_coords = (uniform_ModelViewMatrix * in_Position).xyz; 
normal = normalize(uniform_NormalMatrix * in_Normal); 

和片斷:

uniform samplerCube uniform_ReflectionTexture; 
... 
vec3 normal = normalize(normal);  
vec3 reflectedDirection = reflect(normalize(ws_coords), normal); 
frag_Color = texture(uniform_ReflectionTexture, reflectedDirection).xyz 

我發現在互聯網上的所有着色器具有相同的問題,或者對我產生怪異的結果。

我想我需要旋轉反射的方向與相機旋轉,但我不知道我該怎麼做。在着色器輸入上,我具有世界空間相機位置,MVP,MV,M和Normal矩陣。

你能幫我實現着色器,這需要考慮攝像頭的方向。

回答

1

這部分似乎有點奇怪我:

VEC3 reflectedDirection =反映(正常化(ws_coords),正常);

反映的第一個參數必須是從像素位置到相機位置的矢量,在世界空間中。

我建議你有一個相機的世界位置,然後把你的位置帶到世界空間(我不知道他們當前在哪個空間),並從中創建一個標準化的矢量。然後使用世界空間法線向量反射並對立方體貼圖進行採樣。

+0

謝謝,夥計。這解決了我的問題 – xorza

1

好吧,我找到了答案,

我的問題是,我沒有計算在ViewSpace,這就是爲什麼反思是靜態的。我的NormalMatrix也在ViewSpace中。

所以解決方法是

ws_coords = (uniform_ModelMatrix * in_Position).xyz; 
normal = normalize(uniform_NormalMatrix * in_Normal); 

和長汀從viewspace普通矩陣模型空間。