深度缓冲区值在更改着色器上重置?

我有2个不同的着色器,当我更改着色器(glUseProgram)时,深度信息似乎丢失了,因为使用第二个着色器绘制的所有内容都完全出现在第一个着色器绘制的任何顶部。

如果我切换着色器使用/绘制的顺序,那么它是一样的(如果在两个对象之间存在着色器变化,即使最后绘制的对象距离较远,最后绘制的对象总是出现在第一个绘制的对象之上)

在更改着色器时,我将确认深度缓冲区未被OpenGL ES2清除。

如果你的代码似乎这样做了,那就表明你的一个bug。 检查glClear(GL_DEPTH_BUFFER_BIT)调用,这可能是由着色器更改代码间接触发的(我建议在debugging器中每次调用glClear时都要加一个断点,以确切地知道它们何时被调用)

你可能还应该检查你是不是调用glDisable(GL_DEPTH_TEST)或修改glDepthFunc()的方式,当深度testing已经被完全禁用时(这两个不同的问题会导致深度缓冲区出现被清除在许多types的场景中通常看起来相同)。

好的,我已经启用了深度testing,但是我没有深度缓冲区。 那真是令人惊讶!

在ES2中添加深度缓冲区 :

整个initresizeFromLayer函数变成:

 // Create an ES 2.0 context - (id <ESRenderer>) init { if (self = [super init]) { context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; // Create the vertex formats + shaders if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders]) { return nil; } // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer glGenFramebuffers(1, &defaultFramebuffer); glGenRenderbuffers(1, &colorRenderbuffer); glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); /////NEW!!//////////////////////// glGenRenderbuffers(1, &depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); } return self; } - (BOOL) resizeFromLayer:(CAEAGLLayer *)layer { // Allocate color buffer backing based on the current layer size glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; int backingWidth,backingHeight; /////NEW!!//////////////////////// glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); // linked post says need this if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); return NO; } return YES; }