代码之家  ›  专栏  ›  技术社区  ›  Jayco

libgdx-着色器忽略第一帧中的混合/alpha

  •  4
  • Jayco  · 技术社区  · 11 年前

    我正在使用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" +
                        "}";
    

    如何将第一帧渲染为应有的样子?

    谢谢

    2 回复  |  直到 11 年前
        1
  •  1
  •   Jayco    11 年前

    create()中的glBlendFunc实现了这一点,具体来说:“Gdx.gl20.glBlendFun(gl20.GL_SRC_ALPHA,L20.GL_ONE_MINUS_SRC_AALPHA);”我正在使用SpriteBatch渲染网格后的字体。glBlendFunc包含在SpriteBatch内部,看起来这就是为什么所有其他帧都很好的原因。

        2
  •  0
  •   Alex    4 年前

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

    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