2010-12-20 129 views
1

背景:投影矩阵

我努力学习OpenGLES 2.0的iPhone和模板项目,苹果提供在Xcode已经难住了。

默认的项目显示一个2D平方,但我想尝试在Z轴上添加不同深度的顶点。

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

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

问题是,它仍然显示为相同的2D广场。从我的阅读中,我认为这是由投影矩阵设置为正交而不是透视引起的。

问:

如何改变苹果的模板的OpenGL项目中使用OpenGLES 2.0的投影矩阵从正交透视?

我曾尝试:

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中抛出异常。有什么想法吗?

回答

0

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

+0

嗨,John,我认为问题在于glMatrixMode在OpenGLES 2.0中不起作用。我查看了头文件,它并没有显示在2.0版本中,而是在1.0版本中。我在网上阅读了一些内容,glViewport函数取代了glMatrixMode和2.0版本中的一些其他相关函数。任何人都可以确认吗?谢谢! – Hivebrain 2010-12-21 00:15:00

1

我终于得到了预测工作。

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

在Opengles 2.0中,您似乎需要创建自己的投影矩阵并将其应用于位置属性,以便用3D透视图进行渲染。问题是我无法在2.0中找到任何内置方法来生成矩阵。

从查看Jeff LeMarche的代码作为他在Opengles 2.0的章节的一部分发布后,我发现他使用一系列便捷方法生成透视矩阵(以及许多其他好东西)。您可以在这里找到示例项目:http://iphonedevelopment.blogspot.com/2010/07/opengl-es-20-book-teaser.html该文件称为GLCommon。谢谢杰夫!

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

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

它对Matrix3DSetPerspectiveProjectionWithFieldOfView中的近值和远值进行了一些调整,以便让东西在视野中显示出来。

作为学习OpenGLES 2.0的其他人的一个提示,网上有很多关于如何在OpenGLES中进行1.0操作的信息,但并没有这么说,因为它可能已经发布2.0出来之前。无论何时尝试确保代码与2.0一起工作,请检查2.0头文件。如果您使用的是Apple的模板项目,那么它包含两个版本的框架,因此您的1.0代码在构建和运行之前不会被识别为有问题。

+2

作为参考,我还在OpenGL ES 2.0上做了一堂课,其中的视频可以在iTunes U上找到:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=407243028 – 2010-12-29 18:27:33