没有glClear的添加剂混合

时间:2014-11-09 12:47:59

标签: android performance opengl-es

我想在相机预览的表面纹理上添加添加剂混合到我的opengl上下文中。

如果我调用GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT),当我启用混合(20个嘈杂的正方形渲染)时,我会得到奇怪的渲染纹理;预览是正确的但我失去了添加剂混合,因为我已经清除了缓冲区!

使用glClear调用 enter image description here

没有glClear调用 enter image description here

我不知道问题是什么,我是opengl-es的新手,有什么建议吗? 如果需要任何代码,我可以提供更好地理解这个问题。

仅提供相关代码。如有必要,请询问代码的任何其他部分。

public void onSurfaceCreated(GL10 unused, EGLConfig config) {

//compile shader, link program.... etc omitted for brevity 

//enable additive blending
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE);
GLES20.glBlendEquation(GLES30.GL_MAX);
}

public void onDrawFrame(GL10 unused) {
// Do not want to do this, but if i do preview is normal but i lose my blending
//GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);    
surfaceTexture.updateTexImage();
    GLES20.glUseProgram(_onscreenShader); 

    int th = GLES20.glGetUniformLocation(_onscreenShader, "sTexture");
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, _rawVideoTexture); 
    GLES20.glUniform1i(th, 0);
    GLES20.glVertexAttribPointer(_onscreenPositionAttribute, 2, GLES20.GL_FLOAT, false, 4 * 2, pVertex);
    GLES20.glVertexAttribPointer(_onscreenUVAttribute, 2, GLES20.GL_FLOAT, false, 4 * 2, pTexCoord);
    GLES20.glEnableVertexAttribArray(_onscreenPositionAttribute);
    GLES20.glEnableVertexAttribArray(_onscreenUVAttribute);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
}

1 个答案:

答案 0 :(得分:0)

大多数Android设备都有PowerVR,Mali,Adreno或Vivante GPU核心,它们都是延迟的基于平铺的渲染器。这种架构要求每帧开始时的glClear操作告诉OpenGL ES驱动程序何时清除内部三角形分箱队列以及帧缓冲区。如果你不做glClear,这个缓存设计不能正常工作,你会得到奇怪的结果,从一种GPU类型到另一种不同。所以,你真的必须做glClear。