android.opengl.GLES11Ext.glGenFramebuffersOES бросает UnsupportedOperationException - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь использовать статический android.opengl.GLES11Ext в Honeycomb, но продолжаю получать исключение при попытке создать FBO.Приведенный ниже код отлично работает на нескольких устройствах, использующих пакет khronus, но не работает с помощью android.opengl:

  private int createFrameBuffer(GL10 gl, int width, int height, int targetTextureId) {
  GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;
  int framebuffer;
  int[] framebuffers = new int[1];
  gl11ep.glGenFramebuffersOES(1, framebuffers, 0);
  framebuffer = framebuffers[0];
  gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, framebuffer);

  int stencilBuffer;
  int[] renderbuffers = new int[1];
  gl11ep.glGenRenderbuffersOES(1, renderbuffers, 0);
  stencilBuffer = renderbuffers[0];

  gl11ep.glBindRenderbufferOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, stencilBuffer);

  if(mContextSupportsStencilBuffer) {
    gl11ep.glRenderbufferStorageOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, GL11ExtensionPack.GL_STENCIL_INDEX8_OES, width, height);
    gl11ep.glFramebufferRenderbufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_STENCIL_ATTACHMENT_OES, GL11ExtensionPack.GL_RENDERBUFFER_OES, stencilBuffer);         
  }
  else {
    gl11ep.glRenderbufferStorageOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, GL11ExtensionPack.GL_DEPTH_COMPONENT16, width, height);
    gl11ep.glFramebufferRenderbufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES,GL11ExtensionPack.GL_DEPTH_ATTACHMENT_OES, GL11ExtensionPack.GL_RENDERBUFFER_OES, stencilBuffer);
  }

  gl11ep.glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES,GL10.GL_TEXTURE_2D, targetTextureId, 0);
  int status = gl11ep.glCheckFramebufferStatusOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES);
  if (status != GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES) {
     throw new RuntimeException("Framebuffer is not complete: " + Integer.toHexString(status));
  }
  gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);
  return framebuffer;
}

Причина, по которой я хочу использовать пакет android.opengl, заключается в том, что он предоставляет расширение GL_DEPTH24_STENCIL8_OES, которое мне нужнона некоторых устройствах.Устройства, использующие чипсет NVidea Tegra 2, прекрасно работают с приведенным выше кодом.Однако 8,9-дюймовое 4-граммовое устройство Samsung от AT & T использует чип Adreno 220, который не поддерживает GL_STENCIL_INDEX8_OES. Однако он поддерживает GL_DEPTH24_STENCIL8_OES с использованием FBO. Я полагаюсь на собственный движок рендеринга, который в настоящее время поддерживает только OpenGL ES 1.1.до 2.0 было бы нелегко и быстро. Как я могу использовать пакет android.opengl с расширением GL_DEPTH24_STENCIL8_OES и FBO в OpenGL ES 1.1? Я уже несколько дней гуглю, но пока не нашел решения.

Было бы очень полезно, если бы кто-нибудь реализовал пример FrameBufferObjectActivity из Goolge, используя пакет android.opengl вместо khronos.

...