背景
我正在尝试为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抛出异常。有什么想法吗?
答案 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的引用,并实现深度缓冲区的使用。