gles20.glCopyTexImage2D可以在android中运行吗?

时间:2012-11-15 07:55:23

标签: android opengl-es-2.0

我是opengl es的新手,所以我在android4.1中使用示例代码“HelloEffect”来做一些测试。我使用下面的函数来做渲染。如果在renderTexture结束时没有调用“glCopyTexImage2D”函数,那么我可以正确地重新渲染纹理,但如果使用glCopyTexImage2D函数,那么第二次调用renderTexture时,GLToolbox.checkGlError(“glViewport”)将抛出异常。

 public void renderTexture(int texId, int savetexture) {
    if(savetexture == 2)
        texId = mCaptureTexture[0];

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    GLES20.glViewport(0, 0, mViewWidth, mViewHeight);
    GLToolbox.checkGlError("glViewport");

    // Disable blending
    GLES20.glDisable(GLES20.GL_BLEND);

    // Set the vertex attributes
    GLES20.glVertexAttribPointer(mTexCoordHandle, 2, GLES20.GL_FLOAT, false,
            0, mTexVertices);
    GLES20.glEnableVertexAttribArray(mTexCoordHandle);
    GLES20.glVertexAttribPointer(mPosCoordHandle, 2, GLES20.GL_FLOAT, false,
            0, mPosVertices);
    GLES20.glEnableVertexAttribArray(mPosCoordHandle);
    GLToolbox.checkGlError("vertex attribute setup");

    // Set the input texture
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLToolbox.checkGlError("glActiveTexture");
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);
    GLToolbox.checkGlError("glBindTexture");
    GLES20.glUniform1i(mTexSamplerHandle, 0);
    GLES20.glUniform1i(mEffectTypeHandle, 1);

    // Draw
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

     if(savetexture == 1)
        GLES20.glCopyTexImage2D(mCaptureTexture[0], 0, GLES20.GL_RGBA, 0, 0, mTexWidth, mTexHeight, 0); 
    return;
}    

//main workflow

renderTexture(srctexture, 0);
renderTexture(srctexture, 0);
//+above steps is work normal.

renderTexture(srctexture, 1);
renderTexture(srctexture, 2);
//in above steps, when call  renderTexture(srctexture, 2)   
//gLToolbox.checkGlError ("glViewport")will throw exception  

我这样做的目的是保留一份framebuffer的颜色缓冲区,因为我已经对texId纹理做了一些后期处理工作,所以如果我不需要做后期的话,它将节省时间再次处理工作。 我想知道我是否省略了上面的一些关键步骤,或者opengl es 2.0对于这项工作并不完美 祝福!

1 个答案:

答案 0 :(得分:0)

您对checkGLError的使用和解释可能不正确:OpenGL错误报告有状态错误标记在您实际检查之前不会重置

最有可能的是,

GLES20.glCopyTexImage2D(...); 

是设置错误标志的那个。您只是在下次调用glViewPort之后才检查(并重置)它。

...

关于实际问题:如果您可以发布确切的错误消息,我们可以提供有关该行错误的进一步帮助。看起来您的参数指定不正确,它应该类似于

GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, mCaptureTexture[0] );
GLES20.glCopyTexImage2D( GLES20.GL_TEXTURE_2D, ... );