【问题标题】:Porting C++ OpenGL from windows to mac. What to do with GLKMatrix4MakePerspective?将 C++ OpenGL 从 windows 移植到 mac。如何处理 GLKMatrix4MakePerspective?
【发布时间】:2014-02-13 09:43:03
【问题描述】:

我正在尝试将我从 Windows 编写的使用 SFML 和 OpenGL 的 c++ 程序移植到 Mac OS X。我正在使用 g++ 在两个平台上进行编译。

这是我当前计算投影矩阵的代码:

void perspectiveCalculate (int width, int height) {
    // Prevent A Divide By Zero
    if (height<1) height=1;
    if (width<1)  width=1;
    glViewport(0, 0, width, height); // Reset The Current Viewport
    glMatrixMode(GL_PROJECTION);    // Select The Projection Matrix
    glLoadIdentity();               // Reset The Projection Matrix
    //field of vision , width , height , near clipping , far clipping
    //and calculate The Aspect Ratio Of The Window
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 1000.0f);
    glMatrixMode(GL_MODELVIEW);     // Select The Modelview Matrix
    glLoadIdentity();               // Reset The Modelview Matrix
}

但是,g++ 表示不推荐使用 gluPerspective,我应该改用 GLKMatrix4MakePerspective。我在函数上找到了the manual page,但我不确定如何将它与我的其余代码集成。我该怎么办?

【问题讨论】:

    标签: c++ opengl glkit


    【解决方案1】:

    现代 OpenGL 中已弃用所有矩阵代码。如果你有 GL 2.x 上下文,你可以在 Mac 上继续使用它(警告和所有),但如果你想使用 GL 3.2 或更新版本,你只会得到一个核心配置文件上下文,为此你需要迁移到现代OpenGL 代码。 (如果您想在移动平台上使用 OpenGL ES 2.0 或更高版本,则同上。)

    在现代 OpenGL 中,您使用的矩阵设置函数全部消失了。他们使用的固定功能管道被可编程管道所取代......而不是告诉 OpenGL 你想要什么模型、视图和投影矩阵并让它为你做转换,你自己在 GLSL 顶点着色器中进行转换.好消息是,您现在可以利用可编程着色器来实现固定功能管线无法实现的各种效果。坏消息是你必须自己做一些基本的事情。

    做这些基本工作的一部分是找到(或编写)一个数学库来生成所有矩阵,这些矩阵将交给顶点着色器进行转换。 GLKMatrix4 是 Apple 的此类库的一部分。 GLKMatrix4MakePerspective 采用与 gluPerspective 几乎相同的参数集(垂直 FOV 弧度、纵横比、近剪裁距离、远剪裁距离),但它没有设置固定函数矩阵状态,而是返回GLKMatrix4 数据结构。

    然后,您可以通过统一变量将此数据结构传递给顶点着色器。或者,如果您仍然使用 GLKit,您可以查看 [GLKBaseEffect][2],它提供了大致类似于旧的固定功能管道的 Objective-C 接口。

    处理迁移到现代 OpenGL 的整个过程超出了一个 SO 答案的范围。这里有一些资源:

    • http://www.opengl-tutorial.org — 很好的整体教程。他们将 GLM 用于矩阵数学,但您也可以使用 GLKit 数学
    • Migrating to OpenGL Core Profile — Apple 开发者视频
    • "OpenGL Game" Xcode 模板 — 这是用于 iOS 上的 OpenGL ES,但您可以在模拟器中运行它,它提供了一个很好的简单示例,说明如何使用 GLKit 生成矩阵并将它们交给着色器或将它们传递给GLKBaseEffect。 GL 部分在 iOS 和 OS X 上几乎相同。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2015-08-20
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多