Использование буфера глубины в OpenGLES ES 2.0 Iphone - PullRequest
3 голосов
/ 31 октября 2010

Я следовал учебному пособию с использованием буфера глубины в OpenGLES 1.1.Но я использую opengl es 2.0.Внедренный код приводит к ошибке: не удалось создать полный объект кадрового буфера 8cd6.См. Приведенный ниже код:

 (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);

        // Create depth render buffer
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    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));
    }
}

С уважением, Никлас

1 Ответ

2 голосов
/ 02 ноября 2010

Проблема в том, что вы дважды привязываете хранилище к вашему буферу рендеринга глубины, а не к своему буферу рендеринга цвета.Сообщение -renderbufferStorage:fromDrawable: для вашего EAGLContext связывает хранилище с текущим связанным буфером рендеринга, который в вашем случае является буфером рендеринга глубины.Затем вы снова привязываете к нему хранилище с помощью вызова glRenderbufferStorage.

Решение состоит в том, чтобы связать буфер визуализации Color перед отправкой сообщения хранилища, чтобы хранилище получило для него границы.То есть вставьте строку glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); прямо над сообщением после создания буфера рендеринга глубины.Это должно сработать, я смог воспроизвести вашу ошибку и впоследствии решить ее следующим образом.

Примечание.Всегда убедитесь, что правильные буферы связаны.Вы можете проверить, используя glGetIntegerv() для привязки и glGetRenderbufferParameteriv() для дополнительных параметров.

...