Запросить DepthBuffer в OpenGL ES для iPhone - PullRequest
3 голосов
/ 06 декабря 2010

Я создаю 3D-представление OpenGL ES на iPhone и хочу настроить буфер глубины, чтобы я мог его использовать. Я звоню glEnable(GL_DEPTH_TEST) и тому подобное, но поскольку я не настроил z-буфер, он ничего не делает.

Я ищу эквивалентный звонок glutInitDisplayMode(GLUT_DEPTH)

Любая помощь будет приветствоваться. Спасибо!

1 Ответ

7 голосов
/ 06 декабря 2010

Как вы подозреваете, у вас нет буфера глубины. Вам нужно будет прикрепить буфер глубины к вашему кадровому буферу в любом подклассе UIView, который использует CAEAGLLayer в качестве слоя.

Предположим, вы работаете с шаблоном Apple OpenGL ES Xcode, соответствующий подкласс UIView - EAGLView. Там есть метод createFramebuffer, который отвечает за создание кадрового буфера. Сначала он скажет:

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

        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}

То, что это делает, генерирует и связывает буфер кадра, затем он генерирует и связывает буфер цветопередачи, передает в буфер цвета внутреннее хранилище, которое поставляется с CAEAGLLayer, захватывает размеры кадра на потом и присоединяет буфер цвета к буфер рендеринга.

Вам также необходимо создать и прикрепить буфер глубины. Что должно быть так же просто, как (с подходящей переменной экземпляра, добавленной для deepRenderbuffer; набрав прямо здесь):

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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...