private bool _tryFormat( int depthFormat, int stencilFormat )
{
int status, depthRB = 0, stencilRB = 0;
bool failed = false; // flag on GL errors
if ( depthFormat != Gl.GL_NONE )
{
/// Generate depth renderbuffer
Gl.glGenRenderbuffersEXT( 1, out depthRB );
/// Bind it to FBO
Gl.glBindRenderbufferEXT( Gl.GL_RENDERBUFFER_EXT, depthRB );
/// Allocate storage for depth buffer
Gl.glRenderbufferStorageEXT( Gl.GL_RENDERBUFFER_EXT, depthFormat, PROBE_SIZE, PROBE_SIZE );
/// Attach depth
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_DEPTH_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, depthRB );
}
if ( stencilFormat != Gl.GL_NONE )
{
/// Generate stencil renderbuffer
Gl.glGenRenderbuffersEXT( 1, out stencilRB );
/// Bind it to FBO
Gl.glBindRenderbufferEXT( Gl.GL_RENDERBUFFER_EXT, stencilRB );
Gl.glGetError(); // NV hack
/// Allocate storage for stencil buffer
Gl.glRenderbufferStorageEXT( Gl.GL_RENDERBUFFER_EXT, stencilFormat, PROBE_SIZE, PROBE_SIZE );
if ( Gl.glGetError() != Gl.GL_NO_ERROR ) // NV hack
failed = true;
/// Attach stencil
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_STENCIL_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, stencilRB );
if ( Gl.glGetError() != Gl.GL_NO_ERROR ) // NV hack
failed = true;
}
status = Gl.glCheckFramebufferStatusEXT( Gl.GL_FRAMEBUFFER_EXT );
/// If status is negative, clean up
// Detach and destroy
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_DEPTH_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, 0 );
Gl.glFramebufferRenderbufferEXT( Gl.GL_FRAMEBUFFER_EXT, Gl.GL_STENCIL_ATTACHMENT_EXT, Gl.GL_RENDERBUFFER_EXT, 0 );
if ( depthRB != 0 )
Gl.glDeleteRenderbuffersEXT( 1, ref depthRB );
if ( stencilRB != 0 )
Gl.glDeleteRenderbuffersEXT( 1, ref stencilRB );
return status == Gl.GL_FRAMEBUFFER_COMPLETE_EXT && !failed;
}