我正在尝试使用NDK(R5B)生成FRMBuffer对象并在原生Android应用程序内使用模板。目标设备正在运行Froyo 2.2,支持OpenGL ES 2.0。

所以,我一直在我的c ++本地libs中编码了大量的gl代码,并且除此之外,没有任何问题。我似乎似乎不能做到它。

这是FrameBuffer创建的代码Snipplet。完全完全是好的,但屏幕仍然完全是黑色的。这就像我创造的fbo并不真正绑定到应用程序的Java部分创建的GL表面。我的其余应用程序代码都很好,如果我删除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纹理而不是渲染效果......不起作用。

所以,有没有办法解决这个问题?我在这里得到了什么问题吗?如果有人有任何想法,请lemme知道....一直在花费太多时间来看待这个问题......嘿嘿;)

提前感谢!

欢呼!


编辑: 好的,我设法制作模板缓冲区工作,但FBO只是不起作用。我认为Android不完全支持OpenGL ES 2.0(使用R5B BTW)。我认为方法存根是定义的,但没有完全实现。或者创建的GlsurfaceView与FBO不正确链接。

为模板缓冲区,我必须做到

glEnable(GL_DEPTH_TEST);
.

并删除GldepthMask的使用情况,以便他们正常工作。

有帮助吗?

解决方案

@ zennichimaro,用于模板缓冲区使用!

在初始化期间:

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

在渲染过程中:

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

当我需要使用模板时,我使用以下方法取决于我需要的:

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

最后我做了双手技术在模板内绘制...这里是一个例子:

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

我的代码很复杂,所以很难张贴与模板有关的东西,但我希望它会有所帮助;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top