簡體   English   中英

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

[英]libgdx - shader ignores blending/alpha in first frame

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

如何按原樣渲染第一幀?

謝謝

create() 中的 glBlendFunc 可以解決問題,特別是:“Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, L20.GL_ONE_MINUS_SRC_ALPHA);” 我正在使用 SpriteBatch 在網格之后渲染字體。 glBlendFunc 包含在 SpriteBatch 內部,看起來這就是所有其他幀都很好的原因。

我發現 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM