2012-02-08 107 views
0

我正在尝试使用OpenGL ES 2.0中的立方体贴图进行反射映射。我不确定是否正确计算反射方向以传递到片段着色器中的samplerCube。GLSL中的反射映射

首先我有Projection,Model和View矩阵以及一个组合的ModelView矩阵。以下是GLSL中我顶点着色器的代码:

attribute vec4 Position; 
attribute vec3 Normal; 

uniform mat4 Projection; 
uniform mat4 ModelView; 
uniform mat3 Model; 
uniform mat4 ModelViewProjectionMatrix; 
uniform vec3 EyePosition; 

varying vec3 ReflectDir; 


void main() 
{ 
    gl_Position = Projection * ModelView * Position; 
    mediump vec3 EyeDir = normalize(Position.xyz - EyePosition); 

    // Reflect eye direction by normal, and transform to world space 
    ReflectDir = Model * reflect(EyeDir, Normal); 
} 

我的假设是EyeDirection必须位于对象空间中。 (正确吗?) 如何获得物体空间中的EyePosition?我只是通过逆模型视图矩阵来改变摄像机位置(即始终在OpenGL中的{0,0,0}?)?

我试过这个,但是我的片段着色器将所有黑色着色,就像ReflectDir不正确。

有没有人有在Xcode中工作的OpenGL ES 2.0反射映射(与samplerCube)的工作示例?

+0

什么是'Model'?当你这样做时发生了什么错误? – 2012-02-08 15:53:28

+0

模型是将对象空间坐标转换为世界空间坐标的变换矩阵。当我的对象呈现时,它是完全黑色的,但它应该使用片段着色器中的ReflectDir来对samplerCube中的颜色进行采样。所以,我认为我计算ReflectDir的方式有些问题。 – user1081465 2012-02-08 16:32:49

回答

5

通常的做法是在世界坐标系中同时获得眼睛的方向和正常。查找向量然后计算为

vec3 lookup = normalize(reflect(EyeDir, Normal));