2015-02-10 2 views
0

Я пытаюсь сделать текстуру, а затем нарисовать текстуру в квадрат. При создании фреймбуфера я получаю недопустимую операцию после вызовов glFramebufferRenderbuffer и glFramebufferTexture2D. Вот функция, которая должна создать фреймбуфер:OpenGL ES 2.0 Неверная работа при создании фреймбуфера

private void createFrameBuffer() 
{ 
    final int[] texture = new int[1]; 
    frameTextureID = texture[0]; 
    GLES20.glGenTextures(1,texture,0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureID); 

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 

    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); 

    final int[] depthBuffer = new int[1]; 
    GLES20.glGenRenderbuffers(1, depthBuffer, 0); 
    renderBufferID = depthBuffer[0]; 

    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthBuffer[0]); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height); 

    final int[] frameBuffer = new int[1]; 
    GLES20.glGenFramebuffers(1,frameBuffer,0); 
    frameBufferID = frameBuffer[0]; 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,frameBufferID); 

    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, frameTextureID, 0); 
    error("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT , GLES20.GL_RENDERBUFFER, renderBufferID); 
    error("glFramebufferRenderbuffer"); 

    frameBufferComplete("createFrameBuffer"); 

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 
} 

Я не понимаю, что в этом плохого.

ps: Фрейм-буфер завершен, когда я проверяю в конце функции.

ответ

0

Эти первые заявления в неправильном порядке:

final int[] texture = new int[1]; 
frameTextureID = texture[0]; 
GLES20.glGenTextures(1,texture,0); 

Вы получаете значение texture[0], прежде чем она установлена ​​на glGenTextures(). Так frameTextureID всегда будет 0.

Вместо этого должно быть:

final int[] texture = new int[1]; 
GLES20.glGenTextures(1,texture,0); 
frameTextureID = texture[0]; 

отметить также, что RGBA8 (RGBA с 8-разрядными компонентами) не гарантируется быть в формате отображаемого ES 2.0. Это то, что вы используете для своей текстуры с комбинацией GL_RGBA и GL_UNSIGNED_BYTE. Многие реализации поддерживают его с помощью OES_rgb8_rgba8 extension. Но если вы хотите полностью убедиться, что ваш код работает на всех устройствах, вам необходимо использовать один из поддерживаемых форматов, например RGB565:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, 
        GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_5_6_5, null); 
Смежные вопросы