private void initPbuffer() {

    try {
      if (_pbuffer != null) {
        giveBackContext();
        ContextManager.removeContext(_pbuffer);
      }
      final PixelFormat format =
          new PixelFormat(
                  _settings.getAlphaBits(), _settings.getDepthBits(), _settings.getStencilBits())
              .withSamples(_settings.getSamples())
              .withBitsPerPixel(_settings.getColorDepth())
              .withStereo(_settings.isStereo());
      _pbuffer = new Pbuffer(_width, _height, format, _texture, null);
      final Object contextKey = _pbuffer;
      try {
        _pbuffer.makeCurrent();
      } catch (final LWJGLException e) {
        throw new RuntimeException(e);
      }

      final LwjglContextCapabilities caps =
          new LwjglContextCapabilities(GLContext.getCapabilities());
      ContextManager.addContext(
          contextKey, new RenderContext(contextKey, caps, ContextManager.getCurrentContext()));

    } catch (final Exception e) {
      logger.logp(Level.SEVERE, this.getClass().toString(), "initPbuffer()", "Exception", e);

      if (_texture != null && _useDirectRender) {
        logger.warning(
            "Your card claims to support Render to Texture but fails to enact it.  Updating your driver might solve this problem.");
        logger.warning("Attempting to fall back to Copy Texture.");
        _texture = null;
        _useDirectRender = false;
        initPbuffer();
        return;
      }

      logger.log(Level.WARNING, "Failed to create Pbuffer.", e);
      return;
    }

    try {
      activate();

      _width = _pbuffer.getWidth();
      _height = _pbuffer.getHeight();

      deactivate();
    } catch (final Exception e) {
      logger.log(Level.WARNING, "Failed to initialize created Pbuffer.", e);
      return;
    }
  }