我想在相机预览的表面纹理上添加添加剂混合到我的opengl上下文中。
如果我调用GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT),当我启用混合(20个嘈杂的正方形渲染)时,我会得到奇怪的渲染纹理;预览是正确的但我失去了添加剂混合,因为我已经清除了缓冲区!
使用glClear调用
没有glClear调用
我不知道问题是什么,我是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);
}
答案 0 :(得分:0)
大多数Android设备都有PowerVR,Mali,Adreno或Vivante GPU核心,它们都是延迟的基于平铺的渲染器。这种架构要求每帧开始时的glClear操作告诉OpenGL ES驱动程序何时清除内部三角形分箱队列以及帧缓冲区。如果你不做glClear,这个缓存设计不能正常工作,你会得到奇怪的结果,从一种GPU类型到另一种不同。所以,你真的必须做glClear。