【问题标题】:Additive blending without glClear没有 glClear 的添加剂混合
【发布时间】:2015-01-05 20:16:02
【问题描述】:

我想对绑定到我的 opengl 上下文的相机预览的表面纹理进行加法混合。

如果我调用 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);预览是正确的,但由于我已经清除了缓冲区,所以我失去了我的添加剂混合!

使用 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); 
}

【问题讨论】:

  • 我想知道甚至没有一个Android开发者尝试一下!
  • 如果你再给我们看一些代码……

标签: android performance opengl-es


【解决方案1】:

大多数 Android 设备都有 PowerVR、Mali、Adreno 或 Vivante GPU 内核,它们都是基于平铺的延迟渲染器。这种架构需要在每帧开始时执行 glClear 操作,以告知 OpenGL ES 驱动程序何时清除内部三角形合并队列以及帧缓冲区。如果您不执行 glClear,此缓存设计将无法正常工作,您将得到奇怪的结果,这些结果会因一种 GPU 类型而异。所以,你真的必须执行 glClear。

【讨论】:

  • 我同意结果可能会有所不同。但即使我不执行 glClear 并禁用混合,它也正在工作,现在这令人不安,为什么启用混合不能正常工作
  • 因为如果你禁用混合,你就是在告诉 GPU 忽略帧缓冲区的当前内容并用新结果覆盖它们。在这种情况下,是否清除前一个缓冲区并不重要,因为它的内容不会影响最终结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多