我在OpenGL ES中设置透视图时遇到了一些麻烦。有人有任何提示吗?我的ortho项目看起来像这样: glOrthof(-8.0f,self.frame.size.width,-12.0f,self.frame.size.height,-8.0f,20.0f);
如何使用glFrustumf进行类似的设置?
答案 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会发生什么。