Использование OpenGL ES 2.0 FrameBuffer (FBO) и трафарета в собственном коде Android (ndk)

Я пытаюсь сгенерировать объект фреймбуфера и использовать трафарет внутри собственного приложения для Android с помощью NDK (r5b). Целевое устройство работает под управлением froyo 2.2, поддерживающего OpenGL ES 2.0.

Итак, я ' Я писал много кода gl в моих собственных библиотеках C ++ и не столкнулся ни с одной проблемой, кроме этой. Я просто не могу заставить его работать.

Вот фрагмент кода для создания фреймбуфера. Комплектация все хорошо, но экран остается полностью черным. Это похоже на то, что создаваемый мной fbo на самом деле не привязан к поверхности gl, которая создается Java-частью приложения. Остальной код моего приложения в порядке, если я удалю создание и привязку fbo, все будет работать отлично, за исключением того, что у меня не работают трафареты, которые мне нужны для моего приложения.

    GLint backingWidth = 1024;
      GLint backingHeight = 1024;


    //Create the FrameBuffer and binds it
    glGenFramebuffers(1, &_defaultFramebuffer);
    checkGlError("glGenFramebuffers");
    glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
    checkGlError("glBindFramebuffer");

    //Create the RenderBuffer for offscreen rendering // Color
    glGenRenderbuffers(1, &_colorRenderbuffer);
    checkGlError("glGenRenderbuffers color");
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
    checkGlError("glBindRenderbuffer color");
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, backingWidth, backingHeight);
    checkGlError("glRenderbufferStorage color");

    //Create the RenderBuffer for offscreen rendering // Depth
    glGenRenderbuffers(1, &_depthRenderbuffer);
    checkGlError("glGenRenderbuffers depth");
    glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderbuffer);
    checkGlError("glBindRenderbuffer depth");
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
    checkGlError("glRenderbufferStorage depth");

    //Create the RenderBuffer for offscreen rendering // Stencil
    glGenRenderbuffers(1, &_stencilRenderbuffer);
    checkGlError("glGenRenderbuffers stencil");
    glBindRenderbuffer(GL_RENDERBUFFER, _stencilRenderbuffer);
    checkGlError("glBindRenderbuffer stencil");
    glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, backingWidth, backingHeight);
    checkGlError("glRenderbufferStorage stencil");

    // bind renderbuffers to framebuffer object
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderbuffer);
    checkGlError("glFramebufferRenderbuffer depth");
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
    checkGlError("glFramebufferRenderbuffer color");
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _stencilRenderbuffer);
    checkGlError("glFramebufferRenderbuffer stencil");

//Test for FrameBuffer completeness
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    checkGlError("glCheckFramebufferStatus");
    switch (status)
    {
    case GL_FRAMEBUFFER_COMPLETE: LOGI("\n\n\nFLIPBOOM : FBO complete  GL_FRAMEBUFFER_COMPLETE %x\n\n\n", status);break;

    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: LOGI("\n\n\nFLIPBOOM : FBO GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT  %x\n\n\n", status);break;

    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: LOGI("\n\n\nFLIPBOOM : FBO FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT  %x\n\n\n", status);break;

    case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: LOGI("\n\n\nFLIPBOOM : FBO FRAMEBUFFER_INCOMPLETE_DIMENSIONS  %x\n\n\n", status);break;

    case GL_FRAMEBUFFER_UNSUPPORTED: LOGI("\n\n\nFLIPBOOM : FBO GL_FRAMEBUFFER_UNSUPPORTED  %x\n\n\n", status);break;

    default : LOGI("\n\n\nFLIPBOOM : failed to make complete framebuffer object %x\n\n\n", status);
    }

Я также пробовал выполнять рендеринг в 2D-текстура вместо рендербуфера ... тоже не сработала.

Итак, есть ли способ исправить это? Я что-то не так понимаю? Если у кого-то есть идеи, пожалуйста, дайте мне знать .... тратил слишком много времени на поиск этой проблемы ... хе-хе;)

Заранее спасибо!

Ура!


РЕДАКТИРОВАТЬ:

Хорошо, мне удалось заставить работать буфер трафарета, но FBO просто не работают. Я думаю, что OpenGL ES 2.0 не полностью поддерживается Android (используя здесь, кстати, r5b). Я думаю, что заглушки методов определены, но не полностью реализованы. Или созданный GlSurfaceView некорректно связан с FBO.

Что касается буфера трафарета, мне пришлось сделать

glEnable(GL_DEPTH_TEST);

и убрать использование glDepthMask, чтобы они работали правильно.

5
задан Alex I 25 January 2014 в 13:20
поделиться