我在 OpenGL ES 中设置透视图时遇到了一些麻烦。有人有任何提示吗?我的正交项目看起来像这样: glOrthof(-8.0f, self.frame.size.width, -12.0f, self.frame.size.height, -8.0f, 20.0f);
如何使用 glFrustumf 进行类似的设置?
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/
- (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];
}
我一直在用 iphone 处理 opengl es 中的投影问题。上面示例代码中 glfrustum 的参数不起作用(-8.0f,20.f),它们会给出无效参数错误。zNear 似乎“需要”是积极的。
只是想分享知识,因为我一直在努力弄清楚为什么更改这些参数对渲染没有任何影响!
尽管 gluLookAt 不是 openGlE 的一部分,但大多数人只是获取源代码并将其放入他们的项目中。它不是很多代码。至少它会给出一个很好的例子来说明 glFrustum 发生了什么。
这是一篇使用 glFrustumf 的透视函数以及如何将 glOrthof 调用转换为它的帖子,也许它会有所帮助。
请注意,您可能必须在之后调用 glTranslatef 才能使相机居中。
不确定我从 Apple 的 XCode 模板为 OpenGL ES 应用程序创建的投影中出现了什么问题,但这里有一个漂亮的模板,它实际上适用于深度和透视:
http://iphonedevelopment.blogspot.com/2008/12/updated-opengl-es-xcode-project.html
感谢 schnaader 提供的所有帮助。