在GLSL中使相机正常

时间:2015-11-08 10:13:42

标签: c++ opengl glsl

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

gluLookAt(10, 10, -10, -10, -10, 10, 0, 1, 0);

所以我知道如果我想在着色器中使用我的相机的z轴,它将看起来像这个的标准化矢量:

vec3(1.0, 1.0, -1,0);

有没有办法在顶点着色器中计算此向量

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

我正在使用旧的管道(OpenGL v2.0 / GLSL v.1.10)并且不想将向量传递给着色器(尽管我知道这将是通常和高效的方法)。

3 个答案:

答案 0 :(得分:0)

(不赞成)gluLookAt的参数是(vec3)eye_,center_和up_的组成部分( x_表示向量值数据x _

f: ℝ^3 x ℝ^3 x ℝ^3 -> ℝ4xℝ4 
eye_, center_, up_ -> ViewMatrix

因此您可能寻找的是

dir_ = normalize(center_ - eye_), 

您最好在着色器中获取它们的方式和位置取决于您使用的GL和GLSL版本。

此向量

vec3(1.0, 1.0, -1,0);
     

btw的长度为sqrt(3),因此没有标准化。

修改

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

获取

legacy GLSL 1.10.59 doc

GLSL 1.10.59已经有了自定义制服(我无法回想起来自内存,2.0 / 1.10很久以前);因此,你只需将该矢量作为一个整体传递出来,就是这样。

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

答案 1 :(得分:0)

将它作为制服传递给着色器。请参阅glUniform3f的文档。

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

auto cameraUp = camera.getUp();
glUniform3f(uniformLocationInShader, cameraUp.x, cameraUp.y, cameraUp.z)

在顶点着色器中,为相机向上矢量添加一个制服,然后按预期使用它。

uniform vec3 cameraUp;

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

答案 2 :(得分:0)

固定函数顶点变换通过应用两个矩阵来工作:

  1. " ModelView"矩阵从物体空间转换到眼睛空间
  2. "投影"矩阵从眼睛空间转换到剪辑空间
  3. gluLookAt()通过在世界空间中定义一些相机来指定视图矩阵。你似乎想要重建的是这个世界空间中的观察方向。

    然而,具有固定功能GL的不可能。您所拥有的只是产品 view * model。您无法在没有进一步信息的情况下将其分解为viewmodel部分。并且这些信息都不存在于固定功能GL中 - 它永远不会拥有世界空间,或者关心单独的视图矩阵。在应用程序逻辑中确实发生了这种区别 - 如果有的话。

    有趣的问题是:你甚至需要世界空间的观察方向?固定功能GL在眼睛空间中进行这样的计算,其中观察方向是简单的(0,0,-1,0)。

    所以我看到了两个选项:

    1. 使用制服(或将数据传输到着色器的其他方式)来指定一些其他信息,例如已经建议的其他答案
    2. 直接在眼睛空间进行计算