我正在尝试移植一个使用SFML和OpenGL的c ++程序,我将其从Windows写入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
}
Run Code Online (Sandbox Code Playgroud)
但是,g ++说gluPerspective已被弃用,我应该使用GLKMatrix4MakePerspective.我找到了该函数的手册页,但我不确定如何将其与我的其余代码集成.我该怎么办?
现代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答案的范围.这里有一些资源:
GLKBaseEffect.在iOS和OS X上,GL的部分基本相同.