Java 如何在纹理上绘制[Libgdx]

Java 如何在纹理上绘制[Libgdx],java,android,opengl-es,libgdx,Java,Android,Opengl Es,Libgdx,我有原始图像: 我如何才能在这幅图像上画画,而不是获得以下内容: PS:此代码无效: public void render() { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batcher.begin(); batcher.setColor(Color.BLUE); batcher.draw(texture, x, y, width, heig

我有原始图像:

我如何才能在这幅图像上画画,而不是获得以下内容:

PS:此代码无效:

public void render() {
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batcher.begin();
    batcher.setColor(Color.BLUE);
    batcher.draw(texture, x, y, width, height);
    batcher.end();
}

可以使用具有以下逻辑的片段着色器:

if(alpha of the pixel is 1.0) then pixel=cyan
else pixel=white
这当然需要企鹅周围的空间是透明的(a=0)

完整有效代码:

        String vertexShader = "attribute vec4 a_position;\n" +
                "attribute vec4 a_color;\n" +
                "attribute vec2 a_texCoord0;\n" +
                "\n" +
                "uniform mat4 u_projTrans;\n" +
                "\n" +
                "varying vec4 v_color;\n" +
                "varying vec2 v_texCoords;\n" +
                "\n" +
                "void main() {\n" +
                "    v_color = a_color;\n" +
                "    v_texCoords = a_texCoord0;\n" +
                "    gl_Position = u_projTrans * a_position;\n" +
                "}";

        String fragmentShader = "#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "\n" +
                "varying vec4 v_color;\n" +
                "varying vec2 v_texCoords;\n" +
                "uniform sampler2D u_texture;\n" +
                "uniform mat4 u_projTrans;\n" +
                "\n" +
                "void main() {\n" +
                "       vec4 color = v_color * texture2D( u_texture, v_texCoords );\n" +
                "       if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, 0.0 );\n" +
                "       else gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );" +
                "}";

        ShaderProgram shaderProgram = new ShaderProgram(vertexShader,fragmentShader);

        public void render() {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

            batch.begin();
            batch.setShader(shaderProgram);
            batch.draw(texture, x, y, width, height);
            batch.end();

        }

你到底想干什么?这段代码应该可以做到这一点。@Veljko,这段代码只需要着色。是的,那么您必须使用简单的片段着色器。这会覆盖纹理像素的颜色。不过链接图片中有一个很大的灰色阴影。如果alpha正好为1,则最好将颜色设置为青色,否则将其设置为(0,0,0)。(未检查链接图片中的alpha通道,因此不确定)。
        String vertexShader = "attribute vec4 a_position;\n" +
                "attribute vec4 a_color;\n" +
                "attribute vec2 a_texCoord0;\n" +
                "\n" +
                "uniform mat4 u_projTrans;\n" +
                "\n" +
                "varying vec4 v_color;\n" +
                "varying vec2 v_texCoords;\n" +
                "\n" +
                "void main() {\n" +
                "    v_color = a_color;\n" +
                "    v_texCoords = a_texCoord0;\n" +
                "    gl_Position = u_projTrans * a_position;\n" +
                "}";

        String fragmentShader = "#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "\n" +
                "varying vec4 v_color;\n" +
                "varying vec2 v_texCoords;\n" +
                "uniform sampler2D u_texture;\n" +
                "uniform mat4 u_projTrans;\n" +
                "\n" +
                "void main() {\n" +
                "       vec4 color = v_color * texture2D( u_texture, v_texCoords );\n" +
                "       if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, 0.0 );\n" +
                "       else gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );" +
                "}";

        ShaderProgram shaderProgram = new ShaderProgram(vertexShader,fragmentShader);

        public void render() {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

            batch.begin();
            batch.setShader(shaderProgram);
            batch.draw(texture, x, y, width, height);
            batch.end();

        }