2015-08-04 3 views
0

Я пытаюсь создать рендер для класса текстур, который имеет фреймбуфер для позиции и фреймбуфер для вращения. Эта часть отлично работает. Но когда я переключаюсь и возвращаюсь в свое приложение, он падает, потому что проверка состояния framebuffer возвращает frameBuffer неполного отсутствующего вложения.Android: Framebuffer отсутствует вложение

public void setup(Context context) { 
    final float eyeX = 0.0f; 
    final float eyeY = 0.0f; 
    final float eyeZ = 1.5f; 

    final float lookX = 0.0f; 
    final float lookY = 0.0f; 
    final float lookZ = -5.0f; 

    final float upX = 0.0f; 
    final float upY = 1.0f; 
    final float upZ = 0.0f; 

    Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); 

    int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, 
      ShaderHelper.readShader(context, R.raw.vertex_shader));  
    int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, 
      ShaderHelper.readShader(context, R.raw.fragment_shader)); 

    mProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, 
      new String[] {"a_Position", "a_TexCoord"}); 

    vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, 
      ShaderHelper.readShader(context, R.raw.particle_vertex_shader));   
    fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, 
      ShaderHelper.readShader(context, R.raw.particle_fragment_shader)); 

    mPartProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, 
      new String[] {"a_Position"}); 

    // create the ints for the framebuffer, depth render buffer and texture 
    final int[] fb = new int[2]; 
    // generate 
    GLES20.glGenFramebuffers(2, fb, 0); 

    if (!setup) { 
     posTex = ShaderHelper.genTexture(texW, texH, null); 
     velTex = ShaderHelper.genTexture(texW, texH, null); 
     rotTex = ShaderHelper.genTexture(texW, texH, null); 
     rotVelTex = ShaderHelper.genTexture(texW, texH, null); 
     atlasTex = ShaderHelper.loadTexture(context, R.drawable.ship_atlas); 
    } 
    posFb = fb[0]; 
    rotFb = fb[1]; 

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, posFb); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, posTex, 0);  
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, rotFb); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, rotTex, 0); 


    final int buffers[] = new int[2]; 
    GLES20.glGenBuffers(2, buffers, 0); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, spriteBuffer.capacity() * BYTES_PER_FLOAT, spriteBuffer, GLES20.GL_STATIC_DRAW); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[1]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, renderQuad.capacity() * BYTES_PER_FLOAT, renderQuad, GLES20.GL_STATIC_DRAW); 

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix"); 
    mAtlasTexHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_TexAtlas"); 
    mPosTexHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_PosTexture"); 
    mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); 
    mTexCoordHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoord"); 

    mXTexHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Values"); 
    mDXTexHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Transforms"); 
    mPassHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Pass"); 
    mFBPositionHandle = GLES20.glGetAttribLocation(mPartProgramHandle, "a_Position"); 

    spriteBufferIdx = buffers[0]; 
    fbQuadBufferIdx = buffers[1]; 
    setup = true; 

} 

Из того, что я исследовал, текстуры не должны быть перегружены, и только фреймбуферов делать. Это хорошо, потому что тогда мне придется как-то поместить пиксели из старой текстуры в новую текстуру. Но не переделывая текстуры, он падает с ошибкой framebuffer. Чтобы было ясно, код запускается каждый раз при вызове функцииSurfaceChanged.

Как я могу это сделать, поэтому мне не нужно генерировать новую текстуру каждый раз, когда onSurfaceChanged вызывается, не получая ошибку «Ошибка неполного пропущенного вхождения FrameBuffer»?

ответ

0

Поскольку андроид воссоздает контекст каждый раз, когда он сделал паузу мне нужно, чтобы добавить эту строку

glSurfaceView.setPreserveEGLContextOnPause(true);