C++ 转换到眼睛空间的问题

C++ 转换到眼睛空间的问题,c++,glsl,shader,transformation,space,C++,Glsl,Shader,Transformation,Space,我一直在尝试让我的所有灯光进入我正在使用的GLSL着色器的眼睛空间,但我遗漏了一些东西。我不知道我错过了什么。这是我的着色器代码,以防引起问题 varying vec3 normal, lightDir; uniform vec3 lightPos; //gl_Normal: Object Space //gl_Vertex: Object Space //lightDir: Eye Space void main() { vec4 vert; normal = gl_No

我一直在尝试让我的所有灯光进入我正在使用的GLSL着色器的眼睛空间,但我遗漏了一些东西。我不知道我错过了什么。这是我的着色器代码,以防引起问题

varying vec3 normal, lightDir;

uniform vec3 lightPos;

//gl_Normal: Object Space
//gl_Vertex: Object Space
//lightDir: Eye Space

void main()
{
    vec4 vert;
    normal = gl_NormalMatrix * gl_Normal;
    vert = gl_ModelViewMatrix * gl_Vertex;
    lightDir = normalize(vec3(vec4(lightPos, 1.0) - vert));

    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
}
如果不是这样的话,那一定是我改变光位置CPU端的方式,所以这里是我正在做的

eye = inverse(camera->climb(root));
glMultMatrixf(value_ptr(eye));
glUniform3fv(sLight, 1, value_ptr(vec3(eye * light->climb(root) * vec4())));
我的程序中的其他所有东西都工作得很好,但有些东西我没有注意到。注意:摄影机->爬升(根)生成摄影机场景节点在世界空间中的变换。灯光->爬升(根)生成灯光在世界空间中的场景节点的变换


编辑:我的确切症状是我的光线总是出现在眼睛空间的原点(与相机位于同一位置)。

要从注释中移动答案:


为获得灯光的眼睛空间位置而乘以的原点坐标应为vec4(0,0,0,1),而不是vec4(0,0,0,0)。

摄影机->爬升(根)生成灯光场景节点在世界空间中的变换:你的意思是说摄影机在世界空间中的场景节点?或者灯光和摄像机在同一个位置?是的,很抱歉,我会编辑。有趣的是,我的小毛病让我觉得光线总是和相机在同一个位置。我想我可能已经解决了,但是没有。嗯,你的数学对我来说应该是正确的。您是如何确定它设置不正确的?你的症状是什么?是
vec4()
默认为(0,0,0,0)还是(0,0,0,1)?是的,我不太确定,这是我目前看到的唯一潜在问题。不确定它是否有区别,但我认为您希望原点坐标为w=1(否则它将成为一个方向)。等等!重要的是你要提到方向和位置的关系!(如果人们来这里的方向不正确,这可能会对他们有很大帮助)。