我有一个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)并且不想将向量传递给着色器(尽管我知道这将是通常和高效的方法)。
答案 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版本后,可以从
获取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)
固定函数顶点变换通过应用两个矩阵来工作:
gluLookAt()
通过在世界空间中定义一些相机来指定视图矩阵。你似乎想要重建的是这个世界空间中的观察方向。
然而,具有固定功能GL的不可能。您所拥有的只是产品 view * model
。您无法在没有进一步信息的情况下将其分解为view
和model
部分。并且这些信息都不存在于固定功能GL中 - 它永远不会拥有世界空间,或者关心单独的视图矩阵。在应用程序逻辑中确实发生了这种区别 - 如果有的话。
有趣的问题是:你甚至需要世界空间的观察方向?固定功能GL在眼睛空间中进行这样的计算,其中观察方向是简单的(0,0,-1,0)。
所以我看到了两个选项: