【问题标题】:libgdx - shader ignores blending/alpha in first framelibgdx - 着色器忽略第一帧中的混合/alpha
【发布时间】:2014-03-06 22:13:30
【问题描述】:

我正在使用 alpha 颜色小于 1.0 的着色器渲染 libgdx 网格。

在渲染第一帧时,在着色器中设置的 alpha 值被忽略并渲染为 1.0。以下所有渲染帧都可以。

在我之前的项目中使用 glDrawArrays 绘制线条和形状时,我也遇到了同样的情况,我还没有找到解决方案。

libgdx render() 循环中的代码:

    Gdx.gl20.glClearColor(0, 0, 0, 1);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    Gdx.gl20.glEnable(GL20.GL_BLEND);
    MeshManager_colorFill.meshShader.begin();
    MeshManager_colorFill.meshShader.setUniformMatrix("u_worldView", Snappr.camMatrix);

    meshArray_colorFill.render(MeshManager_colorFill.meshShader, GL20.GL_TRIANGLE_FAN, 0, meshArray_colorFill.get(i).getNumVertices()); 

    MeshManager_colorFill.meshShader.end();
    Gdx.gl20.glDisable(GL20.GL_BLEND);

我的着色器(在 create(){} 中编译):

  public static final String meshVertexShader_colorFill =

                    "attribute vec2 a_position;    \n" + 
                    "uniform mat4 u_worldView;\n" + 
                    "void main()                  \n" + 
                    "{                            \n" + 
                    "   gl_Position =  u_worldView * vec4(a_position.xy, 0, 1);  \n"      + 
                    "}                            \n" ;

  public static final String meshFragmentShader_colorFill =

                    "precision mediump float;\n" +  
                    "void main()                                  \n" + 
                    "{                                            \n" + 
                    "  gl_FragColor = vec4(1,1,1,0.2);\n" +
                    "}";

如何按原样渲染第一帧?

谢谢

【问题讨论】:

  • 你用的是什么混合函数? glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);?在渲染第一帧之前,您是否正确清除了 Alpha 通道?
  • 是的,create() 中的 glBlendFunc 可以解决问题,具体来说:“Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, L20.GL_ONE_MINUS_SRC_ALPHA);”我正在使用 SpriteBatch 在网格之后渲染字体。 glBlendFunc 包含在 SpriteBatch 内部,看起来这就是所有其他帧都很好的原因。您可以发布您所说的作为答案,我会接受。谢谢
  • @Jakob 您可以自己回答这个问题,因此您可以将其标记为已解决。谢谢

标签: android opengl-es libgdx shader alpha


【解决方案1】:

create() 中的glBlendFunc 可以解决问题,特别是:“Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, L20.GL_ONE_MINUS_SRC_ALPHA);”我正在使用 SpriteBatch 在网格之后渲染字体。 glBlendFunc 包含在 SpriteBatch 内部,看起来这就是所有其他帧都很好的原因。

【讨论】:

    【解决方案2】:

    我发现 ModelBatch.begin(...) 将通过调用 Gdx.gl.glDisable(GL20.GL_BLEND) 来禁用混合。因此,请确保在调用 ModelBatch.begin() 之后启用混合。

    modelBatch.begin(camera); // resets Blending to false
    // enable Blending
    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    // draw mesh
    mesh.render(shader, GL20.GL_TRIANGLES);
    modelBatch.end();
    

    来源https://stackoverflow.com/a/66820414/2413469

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多