C++ 将灯光世界空间坐标转换为视线空间坐标

C++ 将灯光世界空间坐标转换为视线空间坐标,c++,glsl,C++,Glsl,我正试图在一个场景中模拟聚光灯,以便上一堂图形入门课。任务规定我必须用modernGL做所有事情,因此我不能使用legacy中的任何东西 我一直在阅读OpenGL 4.0着色语言烹饪书以获得这方面的帮助,但我不知道如何获取灯光的眼空间坐标。我知道我希望灯光在世界空间中的位置和方向,我已经尝试通过以下方式将它们转换为视觉空间 //mv = inverse(mv); vec3 light = vec3(vec4(0.0, 15.0, 0.0, 1.0) * mv); vec3 direction =

我正试图在一个场景中模拟聚光灯,以便上一堂图形入门课。任务规定我必须用modernGL做所有事情,因此我不能使用legacy中的任何东西

我一直在阅读OpenGL 4.0着色语言烹饪书以获得这方面的帮助,但我不知道如何获取灯光的眼空间坐标。我知道我希望灯光在世界空间中的位置和方向,我已经尝试通过以下方式将它们转换为视觉空间

//mv = inverse(mv);
vec3 light = vec3(vec4(0.0, 15.0, 0.0, 1.0) * mv);
vec3 direction = vec3(vec4(0.0, -1.0, 0.0, 1.0) * mv);
其中mv是由生成的模型视图矩阵

glm::mat4 modelview_matrix = glm::lookAt(glm::vec3(window.camera.x, window.camera.y, window.camera.z), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

没有任何变换。正如您所看到的,我试图乘以modelview和modelview的倒数,以获得视觉空间。我可以肯定的是,当我移动到物体的另一侧时,物体上的镜面反射高光会随之出现,这两种情况都不起作用。(也就是说,如果我看到的是物体的另一面,那么我不应该看到镜面反射的高光。)

我很确定你想要:

vec3 light = vec3(mv * vec4(0.0, 15.0, 0.0, 1.0));
vec3 direction = vec3(mv * vec4(0.0, -1.0, 0.0, 0.0));
                                             // ^ Note the 0 in the w coordinate

在未反转
mv
矩阵的情况下。是的,乘法的顺序很重要。您在
w
坐标中保留
0
的原因是您不希望方向向量被平移、缩放或旋转。

@johnathoneder我可以问一下,为什么您要尝试将灯光坐标转换为视线空间?另外,如果答案对你有帮助,介意接受吗?