GLSL中的反射映射

时间:2012-02-08 10:26:25

标签: ios reflection opengl-es glsl

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

首先,我有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?我是否只是通过逆ModelView矩阵变换摄像机位置(即在OpenGL中始终位于{0,0,0}?)?

我试过这个,但我的片段着色器将所有内容着色为黑色,就好像ReflectDir不正确一样。

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

1 个答案:

答案 0 :(得分:5)

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

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