【问题标题】:Set projection mode in OpenGL 3?在 OpenGL 3 中设置投影模式?
【发布时间】:2019-03-17 16:09:56
【问题描述】:

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

glMatrixMode(GL_PROJECTION);

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

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

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

【问题讨论】:

  • 您必须将顶点乘以顶点着色器中的投影矩阵。我建议使用GLM library 和例如glm::perspective() 计算投影矩阵(或glm::orthoglm::frustum,...)
  • 此外,glMatrixMode(GL_PROJECTION) 不启用透视投影。它只是告诉 OpenGL 将所有后续矩阵操作调用应用于投影矩阵。是否包含透视投影是一个完全不同的问题。

标签: opengl spatial projection opengl-3


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多