我是opengl的新手,所以我使用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
我这样做的目的是保留帧缓冲区颜色缓冲区的副本,因为我已经对 texId 纹理进行了一些后处理工作,因此如果我不必再次进行后处理工作将节省时间. 我想知道我是否省略了上面的一些关键步骤,或者 opengl es 2.0 不适合这项工作最好的祝愿!