美文网首页libGdx专题
LibGdx图片变为灰色,并提取边缘

LibGdx图片变为灰色,并提取边缘

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2024-08-17 10:04 被阅读0次

    1.shader
    v

    attribute vec4 a_position;
    attribute vec4 a_color;
    attribute vec2 a_texCoord0;
    varying vec4 v_color;
    uniform mat4 u_projTrans;
    varying vec2 v_textCoords;
    
    void main() {
        v_color = a_color;
        v_color.a = v_color.a * (255.0/254.0);
        v_textCoords = a_texCoord0;
        gl_Position = u_projTrans * a_position;
    }
    

    f

    #ifdef GL_ES
    precision mediump float;
    #endif
    varying vec4 v_color;
    varying vec2 v_textCoords;
    uniform sampler2D u_texture;
    
    void main() {
         float offset = 0.005;
         float Gx = -1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(-1.0, -1.0))).r+
                    1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(1.0, -1.0))).r+
                    -2.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(-1.0, 0.0))).r+
                    2.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(1.0, 0.0))).r+
                    -1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(-1.0, 1.0))).r+
                    1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(1.0, 1.0))).r;
    
    
         float Gy = -1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(-1.0, -1.0))).r+
                    -2.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(0.0, -1.0))).r+
                    -1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(1.0, -1.0))).r+
                    1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(-1.0, 1.0))).r+
                    2.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(0.0, 1.0))).r+
                    1.0 * (v_color* texture2D(u_texture,v_textCoords + offset * vec2(1.0, 1.0))).r;
    
        float edgeMagnitude = length(vec2(Gx, Gy));
        if(edgeMagnitude>0.9){
            gl_FragColor = vec4(0.0,0,0,1.0f);
        }else{
            discard;
        }
    }
    

    2.使用

    public class LightGroup extends Group {
        private ShaderProgram program;
        public LightGroup(){
            program = new ShaderProgram(
                    Gdx.files.internal("flight/cir.vert"),
                    Gdx.files.internal("flight/cir.glsl")
            );
            Image image = new Image(Asset.getAsset().getTexture("cirtest.png"));
            addActor(image);
        }
    
        @Override
        public void draw(Batch batch, float parentAlpha) {
            batch.flush();
            batch.setShader(program);
            super.draw(batch, parentAlpha);
            batch.flush();
            batch.setShader(null);
        }
    }
    

    3.原图


    image.png

    处理后:


    image.png
    4.保存到本地
    
            stage.addAction(Actions.delay(0.4f,Actions.run(()->{
                Gdx.app.postRunnable(()->{
                    Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
                    try {
                        PixmapIO.writePNG(Gdx.files.local("screenshot.png"), pixmap);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
    //                Image image = new Image(new Texture(pixmap));
    //                addActor(image);
                    run();
                });
    
            })));
    
    

    注意:一定是 Gdx.app.postRunnable,不可以在Actions.run中直接执行.具体原因是二者执行时机不同

    相关文章

      网友评论

        本文标题:LibGdx图片变为灰色,并提取边缘

        本文链接:https://www.haomeiwen.com/subject/aklukjtx.html