ClassCaseException для GL11ExtensionPack.Рендеринг в текстуры на OpenGL Android - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь выполнить рендеринг в текстуру (действительно думал, что это будет проще, чем это!)

Я нашел этот ресурс: , который, кажется, именно то, что я хочу

Я получаю ClassCastException, однако, на GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

Может кто-нибудь сказать мне, почему?

  public void renderToTexture(GLRenderer glRenderer, GL10 gl)
  {
    boolean checkIfContextSupportsExtension = checkIfContextSupportsExtension(gl, "GL_OES_framebuffer_object");
    if(checkIfContextSupportsExtension)
    {
      GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

      int mFrameBuffer = createFrameBuffer(gl,texture.getWidth(), texture.getHeight(), texture.getGLID());

      gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, mFrameBuffer);

      gl.glClearColor(0f, 1f, 0f, 1f);

      gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);
    }
  }

Проблема устранена путем удаления setDebugFlags(GLSurfaceView.DEBUG_LOG_GL_CALLS);

Тем не менее, он по-прежнему не изменяет текстуру.Я изменил код, поэтому все, что он делает - очищает зеленый цвет, поэтому текстура должна становиться зеленой.Вот метод createFrameBuffer.Я не совсем понимаю все, что происходит в этом: /

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 depthbuffer;
int[] renderbuffers = new int[1];
gl11ep.glGenRenderbuffersOES(1, renderbuffers, 0);
depthbuffer = renderbuffers[0];

gl11ep.glBindRenderbufferOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, depthbuffer);
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, depthbuffer);

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));
  Log.v("error","Frame buffer not complete");
} else {
  gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);
  return -1;
}
return framebuffer;

}

1 Ответ

1 голос
/ 02 апреля 2012

При вызове setDebugFlags на GLSurfaceView для обёртывания экземпляра GL было / имело нежелательный побочный эффект , при котором не реализованы все GL* интерфейсы . К сожалению, проблема не указывает, в какой версии это исправлено.

...