在OpenGL ES中设置glFrustumf

时间:2009-03-17 09:21:53

标签: iphone graphics opengl-es

我在OpenGL ES中设置透视图时遇到了一些麻烦。有人有任何提示吗?我的ortho项目看起来像这样: glOrthof(-8.0f,self.frame.size.width,-12.0f,self.frame.size.height,-8.0f,20.0f);

如何使用glFrustumf进行类似的设置?

6 个答案:

答案 0 :(得分:1)

    - (void)drawView {

    // Replace the implementation of this method to do your own custom drawing

    const GLfloat squareVertices[] = {
        -5.0f, -5.0f, 0.0f,
        5.0f,  -5.0f, 0.0f,
        -5.0f,  5.0f, 0.0f,
        5.0f,   5.0f, 0.0f,
    };

    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);
    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, 0.0f);
    //glOrthof(-8.0f, self.frame.size.width, -12.0f, self.frame.size.height, -8.0f, 20.0f);
    glEnable(GL_DEPTH_TEST);
    perspective(85, 480/320, 0.1,20);
    gluLookAt(0.0f, 0.0f, -5.0f,

              1.0f,  1.0f,  1.0f,

              1.0f,  1.0f,  1.0f);  
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(GL_TRUE);
    glEnable(GL_CULL_FACE);
    glClearDepthf(1.0f);
    glColor4f(0.0f, 0.0f, 1.0f, .90f);

    //glTranslatef(2.5f, 2.5f, 0.0f);
    glVertexPointer(3, GL_FLOAT, 0, squareVertices);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);



    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

答案 1 :(得分:1)

在OpenGL ES中没有像gluLookAt这样的东西,假设这是关于iPhone和OpenGL ES的。这是如何实现的?

请记住,相机位置为(0,0,0),您的方块也在z平面上。 如果你调用glLoadIdentity(),glTranslatef(0.0f,0.0f,0.0f)将不会做任何改变。

也许您可以考虑在设置方法中移动大部分设置部分。 即:GlEnable呼叫和摄像机设置。 确保使用glMatrixMode以便在Projection或Modelview矩阵上操作。 设置可能是:

- (void) setupView {
  glViewport(0, 0, backingWidth, backingHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  // think about the box where all the vertices are.
  glFrustum(-8.0f, 8.0f, -12.0f, 12.0f, -8.0f, 20.0f); 
  // .. all sort of glEnable
}

在drawView中,通过对它们应用一些转换,确保顶点位于相机前面。也有你的顶点颜色。

- (void) drawView {
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(0, 0, 5.0f); // move in front

  glVertexPointer(3, GL_FLOAT, 0, squareVertices);

  // maybe you want to attach colors to your vertices
  const GLubyte squareColors[] = {
            255, 255,   0, 255,
            0,   255, 255, 255,
            0,     0,   0,   0,
            255,   0, 255, 255,
  };
  glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
  glEnableClientState(GL_COLOR_ARRAY);

  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  // .. some other loadidentity and translate and vertex pointer setup and draw
}

OpenGL ES参考可能也很有用: http://www.khronos.org/opengles/sdk/1.1/docs/man/

答案 2 :(得分:1)

我一直在用iphone搞乱opengl es中的投影问题。上面示例代码中glfrustum的参数不起作用(-8.0f,20.f),它们给出了无效的参数错误。 zNear似乎“需要”积极。

只是想分享这些知识,因为我一直试图弄清楚为什么更改这些参数对渲染没有任何影响!

答案 3 :(得分:0)

这是一篇包含perspective function using glFrustumf的文章,以及如何将glOrthof调用转换为它,也许有帮助。

请注意,您可能不得不在之后调用glTranslatef以使相机居中。

答案 4 :(得分:0)

不确定我在Apple的XCode模板中为OpenGL ES应用程序创建的投影有什么打破,但这里有一个非常好的模板,实际上适用于深度nad透视:

http://iphonedevelopment.blogspot.com/2008/12/updated-opengl-es-xcode-project.html

感谢schnaader的所有帮助。

答案 5 :(得分:0)

尽管gluLookAt不是openGlEs的一部分,但大多数人只是抓住源并将其放入他们的项目中。它不是很多代码。至少它会给出一个很好的例子,说明glFrustum会发生什么。