2012-04-01 3 views
0

Я пытаюсь сделать в текстуру (на самом деле думал, что это будет проще, чем это!)ClassCaseException на GL11ExtensionPack. Оказание текстуры на OpenGL андроида

Я нашел этот ресурс: which seems to be exactly what I want

Я получаю 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. Я не очень понимаю все Thats происходит в этом:/

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

Возможно, вы использовали 'setDebugFlags' на используемом' GLSurfaceView'? –

+0

Кроме того, какую версию Android вы используете? –

+0

Я сделал, и 'setDebugFlags' все еще активен в данный момент - попытаюсь ли я его исправить? (при работе atm, попробую, когда я вернусь домой) Я использую версию Android версии 2.3 - увеличен с 2.2, чтобы увидеть, будет ли это работать. – Joe

ответ

1

Вызов setDebugFlags на GLSurfaceView, чтобы обернуть экземпляр GL имеет/был несчастный SideEffect to not implementing all GL* interfaces. К сожалению, проблема не указывает, в какой версии это исправлено.

+0

Спасибо, это была проблема. Тем не менее, он не может заставить его работать! – Joe

+0

oh wait! все пошло зеленым, а затем оно разбилось - это был частичный успех! Он проходит и, кажется, не модифицирует текстуру несколько сотен раз, прежде чем делать это, хотя ... – Joe