2012-04-01 10 views
0

Ich versuche, eine Textur zu machen (dachte wirklich, es wäre als dies einfacher sein!)ClassCaseException auf GL11ExtensionPack. Rendern Textur auf OpenGL android

ich diese Ressource gefunden: which seems to be exactly what I want

Ich erhalte eine Classcast jedoch, auf GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

Kann mir jemand sagen, warum?

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

Ausgabe von Entfernen setDebugFlags(GLSurfaceView.DEBUG_LOG_GL_CALLS);

jedoch festgelegt, die immer noch nicht die Textur zu modifizieren. Ich habe den Code so geändert, dass nur noch die Farbe Grün angezeigt wird. Die Textur sollte also grün werden. Hier ist die createFrameBuffer-Methode. Ich verstehe nicht wirklich alles, das in diesen los:/

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; 

}

+0

Haben Sie '' '' 'DebugFlags' 'auf die benutzte' GLSurfaceView' gesetzt? –

+0

Zusätzlich, welche Android-Version verwenden Sie? –

+0

Ich tat, und 'setDebugFlags' ist im Moment noch aktiv - soll ich versuchen, es zu entfernen? (at work atm, werde versuchen, wenn ich nach Hause komme) Ich benutze Android Version 2.3 - von 2.2 erhöht, um zu sehen, ob es funktionieren würde. – Joe

Antwort

1

Aufruf setDebugFlags auf einem GLSurfaceView die GL-Instanz zu wickeln hat/hatte den unglücklichen Nebeneffekt to not implementing all GL* interfaces. Leider gibt das Problem nicht an, in welcher Version dies behoben ist.

+0

Danke, das war das Problem. Trotzdem kann es nicht funktionieren! – Joe

+0

oh warte! alles wurde grün und dann ist es abgestürzt - das ist ein Teilerfolg! Es geht durch und scheint die Textur ein paar hundert Mal nicht zu modifizieren, bevor man es tut ... – Joe