首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: Framebuffer缺少附件

Android: Framebuffer缺少附件
EN

Stack Overflow用户
提问于 2015-08-04 11:57:13
回答 1查看 251关注 0票数 0

我正在尝试创建一个render to texture类,它有一个用于位置的帧缓冲区和一个用于旋转的帧缓冲区。这部分工作得很好。但当我切换到我的应用程序时,它崩溃了,因为检查帧缓冲区状态会返回framebuffer不完整的缺失附件。

代码语言:javascript
复制
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;

}

根据我的研究,纹理不需要重新加载,只有帧缓冲区需要重新加载。这很好,因为我必须以某种方式将旧纹理中的像素放入新纹理中。但是如果不重做纹理,它就会崩溃,并出现帧缓冲区错误。为了清楚起见,每次调用onSurfaceChanged时都会运行代码。

如何才能避免每次调用onSurfaceChanged时都生成新的纹理,而不会出现FrameBuffer不完整缺失附件错误?

EN

回答 1

Stack Overflow用户

发布于 2015-08-04 18:02:40

由于android在每次暂停时都会重新创建上下文,因此我需要添加下面这一行

代码语言:javascript
复制
glSurfaceView.setPreserveEGLContextOnPause(true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31800437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档