Что не так с использованием буфера рендера глубины?OpenGL ES 2.0 - PullRequest
3 голосов
/ 07 декабря 2010

Я использую этот код:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders])
    {
        [self release];
        return nil;
    }

    glGenFramebuffers(1, &defaultFramebuffer);
    glGenRenderbuffers(1, &colorRenderbuffer);
    glGenRenderbuffers(1, &depthRenderbuffer);

    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Но когда я запускаю приложение, я вижу фиолетовый экран?Что не так с этим кодом?

Ответы [ 2 ]

6 голосов
/ 07 декабря 2010

Я не вижу, где вы привязываете свой цветной рендер-буфер к слою CAEAGLL, на котором он должен отображаться (хотя это может произойти позже), и я не вижу, чтобы вы включали тестирование глубины.Кроме того, если я не ошибаюсь, вам нужно связать буфер визуализации цвета, для этого вызовите glFramebufferRenderbuffer(), затем связайте буфер визуализации глубины и вызовите его снова.

Ниже приведен код, который я использовал для настройки аналогичного дисплея в OpenGL ES 2.0:

glEnable(GL_DEPTH_TEST);

glGenFramebuffers(1, &viewFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);

glGenRenderbuffers(1, &viewRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);

glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{
    NSLog(@"Failure with framebuffer generation");
    return NO;
}

Полный код этого приложения доступен здесь .

1 голос
/ 16 октября 2012

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

glGenBuffers(1, &_colorRenderBuffer);

вместо этого:

glGenRenderbuffers(1, &_colorRenderBuffer);

Конечный результат: фиолетовый экран.

...