【问题标题】:Libgdx use transition spritesLibgdx 使用过渡精灵
【发布时间】:2014-06-12 13:28:11
【问题描述】:

我发现了一些过渡精灵并想在我的程序中使用它们。这只是一张黑白照片。

如何从这个精灵中获取亮度值下的每个像素并将这些像素绘制为黑色,以获得动画?

我尝试过这样的事情:

sr.begin(ShapeType.Filled);
    sr.setColor(0, 0, 0, 1f);
    for(int y = 0; y < 320; y ++) {
        for(int x = 0; x < 531; x ++) {
            transSprite.getTexture().getTextureData().prepare();
            int brightness = transSprite.getTexture().getTextureData().consumePixmap().getPixel(x, y);

            if(brightness <= alpha * 255) {
                sr.rect(x, y, 1, 1);
            }
        }
    }
    sr.end();

但这太慢了。

我的动画分辨率为 531 x 320 像素,alpha 值介于 0 和 1 之间。

你有什么想法吗?

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    这可以通过您的着色器来完成。制作具有阈值的自定义着色器以与 SpriteBatch 一起使用。我复制了默认的精灵批处理着色器,但更改了片段着色器部分。

    String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
                + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
                + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
                + "uniform mat4 u_projTrans;\n" //
                + "varying vec4 v_color;\n" //
                + "varying vec2 v_texCoords;\n" //
                + "\n" //
                + "void main()\n" //
                + "{\n" //
                + "   v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
                + "   v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
                + "   gl_Position =  u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
                + "}\n";
            String fragmentShader = "#ifdef GL_ES\n" //
                + "#define LOWP lowp\n" //
                + "precision mediump float;\n" //
                + "#else\n" //
                + "#define LOWP \n" //
                + "#endif\n" //
                + "varying LOWP vec4 v_color;\n" //
                + "varying vec2 v_texCoords;\n" //
                + "uniform sampler2D u_texture;\n" //
                + "uniform float u_threshold;\n" //
                + "void main()\n"//
                + "{\n" //
                + "  vec4 texture = texture2D(u_texture, v_texCoords);\n" //
                + "  gl_FragColor = v_color * step(u_threshold, texture.r);\n" //
                + "}";
    
            customShader = new ShaderProgram(vertexShader, fragmentShader);
    

    然后您可以通过更改 u_threshold 值来为其设置动画。

    spriteBatch.setShader(customShader);
    spriteBatch.begin();
    customShader.setUniformf("u_threshold", brightness); //where brightness is from 0 to 1
    spriteBatch.draw(sprite);
    spriteBatch.end();
    

    【讨论】:

    • 如果您仅将纹理加载为 ALPHA,则在片段着色器中使用 texture.a 而不是 texture.r
    猜你喜欢
    • 2014-04-04
    • 2023-03-31
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多