我正在尝试使用在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)的工作示例?
答案 0 :(得分:5)
通常的方法是在世界坐标系中同时获得眼睛方向和法线方向。然后将查找向量计算为
vec3 lookup = normalize(reflect(EyeDir, Normal));