Apple的iPhone OpenGLES 2.0模板项目中的投影矩阵

时间:2010-12-20 19:33:19

标签: iphone ios opengl-es

背景

我正在尝试为iPhone学习OpenGLES 2.0,并且被Apple在xCode中提供的模板项目所困扰。

默认项目显示2d方格,但我想尝试在z轴上添加不同深度的顶点。

在Apple的默认OpenGL项目中,他们只使用传递给顶点着色器的x和y坐标绘制一个2d的正方形。

为了试验在3d空间中放置顶点,我在示例项目中的顶点数据中添加了一个z值。然后我将glVertexAttribPointer方法中的size参数从2更改为3.我更改了顶点上的z值,希望在运行程序时它会使方块向后倾斜。

问题是它仍然显示为相同的2d方格。从我的阅读中,我相信这是由投影矩阵设置为正交而不是透视。

问题:

如何在Apple的模板OpenGL项目中使用OpenGLES 2.0将投影矩阵从Orthographic更改为Perspective?

我试过了:

glMatrixMode(GL_PROJECTION);  glLoadIdentity();  glFrustumf(-0.5,0.5,-0.5,0.5,1,10);

但它没有改变结果。

我也试过在顶点着色器程序中添加这样的东西:


mat4 projectionMatrix = {2.0 / 320.0,0.0,0.0,-1.0,          0.0,2.0 / 480.0,0.0,-1.0,          0.0,0.0,-1.0,0.0,   0.0,0.0,0.0,1.0};

gl_Position * = projectionMatrix;


但这也不起作用。


为OpenGLES 2.0设置投影矩阵的方法是否与1.0相同。我想也许我正在尝试的东西与2.0不兼容。

提前致谢。

麦克

更新

感谢你的帮助约翰。对此,我真的非常感激。我尝试通过在我的EAGL视图中的createFramebuffer方法中添加以下代码,根据您的建议添加深度缓冲区,但仍然没有更改。

// Create depth render buffer and allocate backing store.
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

如果我将以下代码添加到我的渲染方法中:

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustumf(-0.5, 0.5, -0.5, 0.5, 1, 10);

Xcode抛出异常。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我终于得到了投射。

所以,这不是一个深度缓冲问题,因为除非你从我所听到的多个深度构造多个对象,否则显然不需要它。

似乎在Opengles 2.0中,您需要创建自己的投影矩阵并将其应用于position属性,以便使用3d透视渲染事物。问题是我在2.0中找不到任何用于生成矩阵的内置方法。

通过查看Jeff LeMarche在其关于Opengles 2.0的章节中发布的代码,我发现他使用带有一些便利方法的文件来生成透视矩阵(以及许多其他好东西)。您可以在此处找到该示例项目:http://iphonedevelopment.blogspot.com/2010/07/opengl-es-20-book-teaser.html该文件名为GLCommon。谢谢Jeff!

为了创建和应用投影矩阵,我使用了GLCommon文件中名为Matrix3DSetPerspectiveProjectionWithFieldOfView的方法。

设置一个矩阵,可以作为一个统一体传递给顶点着色器,然后乘以position属性,然后传递给gl_Position。

对Matrix3DSetPerspectiveProjectionWithFieldOfView中的near和far值进行了一些调整,以便让所有内容显示在视野中。

作为其他人尝试学习OpenGLES 2.0的提示,网上有大量有关如何在OpenGLES中执行1.0版本的信息,但并未这样说,因为它可能是在之前发布的2.0出来了。每当尝试某些操作时检查2.0标头,以确保代码适用于2.0。如果您正在使用Apple的模板项目,它包含两个版本的框架,因此在您构建和运行之前,您的1.0代码将不会被识别为有问题。

答案 1 :(得分:0)

听起来您正在使用不默认使用深度缓冲区的示例。在示例项目中查找对GL_DEPTH_COMPONENT16的引用,并实现深度缓冲区的使用。