我在iPhone上创建了一个3D OpenGL ES视图,并且想要设置深度缓冲区,因此我可以使用它。我打电话glEnable(GL_DEPTH_TEST)
等等,但因为我没有设置z缓冲区,它什么都不做。在OpenGL ES中请求DepthBuffer for iPhone
我在寻找一个相当于调用 glutInitDisplayMode(GLUT_DEPTH)
任何帮助将是非常受欢迎的。谢谢!
我在iPhone上创建了一个3D OpenGL ES视图,并且想要设置深度缓冲区,因此我可以使用它。我打电话glEnable(GL_DEPTH_TEST)
等等,但因为我没有设置z缓冲区,它什么都不做。在OpenGL ES中请求DepthBuffer for iPhone
我在寻找一个相当于调用 glutInitDisplayMode(GLUT_DEPTH)
任何帮助将是非常受欢迎的。谢谢!
正如你怀疑的那样,你没有深度缓冲区。您需要在您创建的任何UIView子类中使用CAEAGLLayer
作为其图层,将深度缓冲区附加到帧缓冲区。
假设您正在使用Apple的OpenGL ES Xcode模板,相关的UIView子类是EAGLView。那里有一个方法createFramebuffer,它负责创建帧缓冲区。最初,它会说:
什么,做是生成并绑定一个帧缓冲,然后生成并绑定一个颜色渲染缓冲,礼品颜色缓冲区,与一个CAEAGLLayer固有的存储,抓起框架用于稍后的尺寸并将颜色缓冲区附加到渲染缓冲区。
您还需要创建并附加深度缓冲区。这应该是那样简单(与添加depthRenderbuffer合适的实例变量,直接在这里键入):
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
这做什么它看起来像它 - 生成并绑定一个渲染缓冲,分配它的存储是与颜色缓冲区尺寸相同的16位深度缓冲区,然后将其附加到帧缓冲区。
因此,在总(未经测试):
- (void)createFramebuffer
{
if (context && !defaultFramebuffer)
{
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
// 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);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
}
这应该工作(它匹配的代码,我提供了一个深度缓存),如果你是使用OpenGL ES,但要注意的是,函数和常量命名2.0。对于OpenGL ES 1.1,您需要添加`OES`后缀来创建`glGenRenderbuffersOES()`,`GL_RENDERBUFFER_OES`等.Xcode会提示您缺少语法高亮需要修改哪些内容。 – 2010-12-06 02:41:16