5

libgdx のテクスチャをグレースケール イメージに変換する方法はありますか? これまでのところ、グレースケールにしたい画像を複製して手動で行いましたが、ゲームがますます多くの画像を使用し、多くのディスク容量を使用するため、最善の解決策ではないと思います.

4

3 に答える 3

9

コピー/貼り付けコードを使用したい人のために、これを共有したいと思います。

import com.badlogic.gdx.graphics.glutils.ShaderProgram;

public class GrayscaleShader {
    static 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" +
            "}";

    static 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" +
            "\n" +
            "void main() {\n" +
            "  vec4 c = v_color * texture2D(u_texture, v_texCoords);\n" +
            "  float grey = (c.r + c.g + c.b) / 3.0;\n" +
            "  gl_FragColor = vec4(grey, grey, grey, c.a);\n" +
            "}";

    public static ShaderProgram grayscaleShader = new ShaderProgram(vertexShader,
            fragmentShader);
}

それを使用するには、呼び出します

spriteBatch.setShader(GrayscaleShader.grayscaleShader)

グレースケールを使い終わったら、忘れずに

spriteBatch.setShader(null);
于 2014-04-07T11:45:02.037 に答える
2

テクスチャを輝度のみ、または GLES の輝度とアルファとしてロードできます ( glTexImage2Dを参照)。libgdx では、 Textureをインスタンス化するときにPixFormat.Intensity (輝度) またはLuminanceAlpha (輝度とアルファ)を指定できます。これにより、グレースケール テクスチャが生成されます。

2 つのテクスチャ (1 つのカラー、1 つのグレースケール) をロードする必要がありますが、それらは同じソースを使用でき、輝度はメモリ内のピクセルあたり 1 バイトしか使用しません。より効率的な解決策は、PT で提案されているシェーダーを実装することですが、GLES 2 からのみ利用できます。

于 2013-07-08T02:32:14.087 に答える