Question

J'essaie de générer un objet Frambuffer et d'utiliser le pochoir dans une application Android native à l'aide du NDK (R5B). Le périphérique cible exécute FROYO 2.2, prenant en charge OpenGL ES 2.0.

Donc, j'ai codé beaucoup de code GL dans mes libs natifs C ++ et je n'ai pas réussi à parvenir à ce problème, sauf pour cela. Je ne peux pas sembler le faire fonctionner.

Voici un extrait de code pour la création de framebuffer. La complétude est bonne, mais l'écran reste complètement noir. C'est comme si le FBO que je crée n'était pas vraiment lié à la surface GL qui est créée par la partie Java de l'application. Le reste de mon code d'application est bon, si je supprime la création et la liaison FBO, tout fonctionne parfaitement bien, sauf que je n'ai pas les pochoirs dont j'ai besoin pour mon application.

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

J'ai également essayé de rendre une texture 2D au lieu du Renderbuffer ... je n'ai pas fonctionné non plus.

Alors, y a-t-il un moyen de résoudre ce problème? Est-ce que je fais quelque chose de mal ici? Si quelqu'un a des idées, veuillez le savoir ... pas trop de temps à chercher ce problème ... hehe;)

Merci d'avance !

Acclamations !


ÉDITER :

OK, j'ai réussi à faire fonctionner le tampon de pochoir, mais le FBO ne fonctionne tout simplement pas. Je pense que OpenGL ES 2.0 n'est pas entièrement pris en charge par Android (en utilisant R5B ici BTW). Je pense que les talons de méthode sont définis, mais pas entièrement implémentés. Ou le GLSurfaceView créé ne se lie pas correctement avec les FBO.

Quant au tampon de pochoir, je devais faire

glEnable(GL_DEPTH_TEST);

et supprimez l'utilisation de Gldepthmask pour qu'ils fonctionnent correctement.

Était-ce utile?

La solution

@ Zennichimaro, pour l'utilisation du tampon de pochoir!

Pendant l'initialisation:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glEnable(GL_DEPTH_TEST);

Pendant le rendu:

glViewport(0, 0, GetViewWidth(), GetViewHeight());
checkGlError("glViewport");

if (_firstRenderDone == false)
{
    glClearDepthf( 0.9f );
    glDepthMask( GL_TRUE );
    glClear( GL_DEPTH_BUFFER_BIT );
    glDepthMask( GL_FALSE );
    _firstRenderDone = true;
}

glClearColor(M_channelToFloat(_backgroundColor.r),
               M_channelToFloat(_backgroundColor.g),
               M_channelToFloat(_backgroundColor.b),
               M_channelToFloat(_backgroundColor.a));
checkGlError("glClearColor");
glClearStencil( 0 );
checkGlError("glClearStencil");
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
checkGlError("glClear");

_stencilLayer = 1;

//use our custom shaders
if( _program )
{
    glUseProgram(_program);


    if( transformMatrix3x3 != NULL )
    {
        glUniformMatrix3fv( _uniforms[OGL_UNIFORM_TRANSFORM], 1, false, transformMatrix3x3 );
    }

     // reset the shading.
    glUniform1f( _uniforms[ OGL_UNIFORM_SHADE ], 0.0f );
}


//Do the actual drawing (Triangle Slip)
 if( object )
  {
     _isRender = true;
    object->OglDraw(this);
    _isRender = false;
  }

Lorsque j'ai besoin d'utiliser du pochoir, j'utilise les méthodes suivantes en fonction de ce dont j'ai besoin:

void GlEs2Renderer::StencilStartMask()
{
if (!USE_STENCIL)   //For debugging purpose
    return;


glEnable(GL_STENCIL_TEST);

//Turn off writing to the Color Buffer and Depth Buffer
//We want to draw to the Stencil Buffer only
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );

//Set 1 into the stencil buffer
glStencilFunc( GL_ALWAYS, NewStencilLayer(), 0xFFFFFFFF );
glStencilOp( GL_ZERO, GL_ZERO, GL_REPLACE );
}

void GlEs2Renderer::StencilUseMask()
{
if (!USE_STENCIL)   //For debugging purpose
        return;

//Turn back on Color Buffer and Depth Buffer
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );

//Only write to the Stencil Buffer where 1 is set
glStencilFunc( GL_EQUAL, StencilLayer(), 0xFFFFFFFF);

//Keep the content of the Stencil Buffer
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
}

void GlEs2Renderer::StencilOverlayMask()
{
if (!USE_STENCIL)   //For debugging purpose
        return;

//Turn back on Color Buffer and Depth Buffer
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
glDepthMask(true);

//Only write to the Stencil Buffer where 1 is set
glStencilFunc( GL_EQUAL, StencilLayer(), 0xFFFFFFFF);

//Keep the content of the Stencil Buffer and increase when z passed
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
}

Et enfin, je fais la technique à double pass pour dessiner à l'intérieur du pochoir ... Voici un exemple:

glVertexAttribPointer(OGL_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, _triangles);
glEnableVertexAttribArray(OGL_ATTRIB_VERTEX);
glVertexAttribPointer(OGL_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 1, 0, _colors);
glEnableVertexAttribArray(OGL_ATTRIB_COLOR);

glContext->StencilStartMask();
glDrawArrays(GL_TRIANGLE_STRIP, 0, _nPoints);

glContext->StencilUseMask();;
glDrawArrays(GL_TRIANGLE_STRIP, 0, _nPoints);

glContext->StencilEndMask();

Mon code est assez complexe, il est donc difficile de publier uniquement ce qui est lié au pochoir, mais j'espère que cela aidera;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top