1

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

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

4

6 回答 6

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/

于 2009-03-18T11:58:02.553 回答
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];
}
于 2009-03-17T18:39:59.077 回答
1

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

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

于 2009-04-16T09:53:38.267 回答
0

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

于 2009-04-16T07:18:21.150 回答
0

这是一篇使用 glFrustumf 的透视函数以及如何将 glOrthof 调用转换为它的帖子,也许它会有所帮助。

请注意,您可能必须在之后调用 glTranslatef 才能使相机居中。

于 2009-03-17T09:30:33.470 回答
0

不确定我从 Apple 的 XCode 模板为 OpenGL ES 应用程序创建的投影中出现了什么问题,但这里有一个漂亮的模板,它实际上适用于深度和透视:

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

感谢 schnaader 提供的所有帮助。

于 2009-03-17T19:48:02.917 回答