C++ 在GLSL中使相机正常

C++ 在GLSL中使相机正常,c++,opengl,glsl,C++,Opengl,Glsl,我有一个OpenGL场景,在这里我可以看到这样一个对象: gluLookAt(10, 10, -10, -10, -10, 10, 0, 1, 0); auto cameraUp = camera.getUp(); glUniform3f(uniformLocationInShader, cameraUp.x, cameraUp.y, cameraUp.z) 因此,我知道如果我想在着色器中使用相机的z轴,它将看起来像这一个的标准化向量: vec3(1.0, 1.0, -1,0); 是否有方

我有一个OpenGL场景,在这里我可以看到这样一个对象:

gluLookAt(10, 10, -10, -10, -10, 10, 0, 1, 0);
auto cameraUp = camera.getUp();
glUniform3f(uniformLocationInShader, cameraUp.x, cameraUp.y, cameraUp.z)
因此,我知道如果我想在着色器中使用相机的z轴,它将看起来像这一个的标准化向量:

vec3(1.0, 1.0, -1,0);
是否有方法在顶点着色器中计算此向量

我曾想过计算近/远剪裁平面的法线,但在顶点(或片段)着色器中找不到这样做的方法

我使用的是旧的管道(OpenGL v2.0/GLSL v.1.10),不想将向量传递给着色器(尽管我知道这是通常的执行方式)。

的参数(不推荐)是(vec3)眼、中心和向上(x表示向量值基准x)的组件

因此,你可能要寻找的是

dir_ = normalize(center_ - eye_), 
在着色器中如何以及在何处获得它们取决于您使用的GL和GLSL版本

这个向量

顺便说一句,长度sqrt(3),因此它不是标准化的

编辑

在了解了OpenGL和GLSL版本后,您可以从

GLSL 1.10.59已经有了定制的制服(从记忆中我不记得2.0/1.10是很久以前的事了);因此,你只需把这个向量作为一个统一体传递进去,就这样


因为它用于每个顶点,所以在着色器中计算一次要比再次计算每个顶点更有效(当然,假设渲染的顶点块相当大)。

将其作为统一的对象传递给着色器。有关详细信息,请参阅文档

在客户端代码中,执行以下操作:

gluLookAt(10, 10, -10, -10, -10, 10, 0, 1, 0);
auto cameraUp = camera.getUp();
glUniform3f(uniformLocationInShader, cameraUp.x, cameraUp.y, cameraUp.z)
在顶点着色器中,为摄影机上方向向量添加统一,然后按预期使用它

uniform vec3 cameraUp;

void main() 
{
   // do stuff with cameraUp
} 

固定函数顶点变换通过应用两个矩阵进行:

  • 从对象空间到眼睛空间的“模型视图”矩阵变换
  • 眼空间到剪辑空间的投影矩阵变换
  • gluLookAt()所做的是通过在世界空间中定义一些摄影机来指定视图矩阵。你想重建的是这个世界空间的观察方向

    但是,对于固定功能GL,这是不可能的。您所拥有的只是产品
    view*型号
    。如果没有进一步的信息,您无法将其分解为
    视图
    模型
    部分。这些信息都不存在于固定函数GL中-它从来没有世界空间,也不关心单独的视图矩阵。这种区别确实发生在应用程序逻辑中(如果有的话)

    有趣的问题是:你甚至需要世界空间的观察方向做什么?固定函数GL在眼睛空间中进行此类计算,其中观察方向仅为(0,0,-1,0)

    因此,我为您提供了两种选择:

  • 使用统一的(或将数据传输到着色器的其他方法)指定一些附加信息,就像其他答案已经建议的那样
  • 直接在眼睛空间进行计算

  • 谢谢你的回答,但是我正在寻找一种在顶点着色器中计算法线的方法。有办法做到这一点吗?@Corbie当然,但请发布您的GL和GLSL版本@Corbie和你用来填充着色器的制服,如果有的话。我已经添加了版本。没有相关制服。欢迎使用SO!请在OpenGL/GLSL问题中添加OpenGL版本(和GLSL版本,如果相关)
    gluLookAt
    已被弃用,但在有关OpenGL的讨论中,它仍然作为一个短语使用,因此我不知道您是在技术上使用它,还是仅用于说明。OpenGL 1.1没有GLSL。;这是从OpenGL 2.0开始的对不起,现在更有意义的是OpenGL v2.0/GLSL v1.10我知道这很聪明,但这正是我不想做的;-)嗯,你需要向着色器传递某种一致性,以获得此信息。。。如果你把视图矩阵作为一个统一的矩阵,你应该能够从这些列中得到上方向向量,所以我想这是唯一的方法?我不能使用眼平面或类似的东西吗?是的,这正是制服的目的:将信息传递给着色器。。。顺便说一句,近剪裁平面和远剪裁平面是投影矩阵的一部分。这和你相机的上方向向量无关,我只需要z方向向量。我能从投影矩阵中提取它吗?第2点。成功了。我想计算相机观察方向和顶点法线的点积。所以诀窍不仅是尝试变换相机法线,还包括顶点:最后我使用了:
    vertexNormal=gl_NormalMatrix*gl_normal
    vertexViewDirection=-normalize(gl_ModelViewMatrix*gl_Vertex).xyz