首页 > 解决方案 > 在 OpenGL 3 中设置投影模式?

问题描述

在旧的 OpenGL 版本中,可以通过调用来启用空间投影(对象随着距离的增加而变小)

glMatrixMode(GL_PROJECTION);

(至少据我所知,这是启用此模式的调用)。

在 OpenGL 3 中 - 当不再使用这种慢速堆栈模式时 - 此功能不再起作用。

那么我怎么能在这里有同样的空间效果呢?这样做的预期方式是什么?

标签: openglspatialprojectionopengl-3

解决方案


你完全误解了glMatrixMode实际做了什么。旧的、遗留的 OpenGL 固定函数管道保留了一组矩阵,这些矩阵在绘制东西时都被不加选择地使用。两个最重要的矩阵是:

  • 模型视图矩阵,用于描述模型局部空间到视图空间的转换。视空间仍然是一种抽象,但可以理解为将世界转化为“相机”的坐标空间。照明计算发生在那个空间。

  • 投影矩阵,用于描述从视图空间到剪辑空间的转换。剪辑空间是到达设备坐标之前的中间阶段(其中涉及的重要细节很少,但现在并不重要),主要涉及应用同质除法,即通过其 w- 的倒数缩放剪辑坐标向量零件。

固定的转换管道始终

position_view := Modelview · position
do illumination calculations with position_view
position_clip := Projection · position_view
position_pre_ndc := position_clip · 1/position_clip.w

在旧版 OpenGL 中,模型视图和投影矩阵始终存在。glMatrixMode是一个选择器,现有矩阵中的哪些受矩阵操作函数完成的操作。这些功能之一是glFrustum生成和乘以透视矩阵,即,将通过同质划分产生透视效果的矩阵。

那么我怎么能在这里有同样的空间效果呢?这样做的预期方式是什么?

您生成所需属性的透视矩阵,并使用它将您指定为模型局部位置的顶点属性转换为剪辑空间,并将其提交到gl_Position顶点着色器的输出中。执行此操作的常用方法是将模型视图和投影矩阵作为制服传入。

这样做的最简单的 GLSL 顶点着色器将是

#version 330
uniform mat4 modelview;
uniform mat4 projection;
in vec4 pos;
void main(){
    gl_Position = projection * modelview * pos;
}

至于生成投影矩阵:所有流行的计算机图形数学库都可以满足您的需求并具有相应的功能。


推荐阅读