有没有一种方法可以将libgdx的Texture转换为灰度图像?到目前为止,我已经复制了我想要转换为灰度的图像,并且手动进行了操作,但我认为这不是最好的解决方案,因为我的游戏使用了越来越多的图像,并且它使用了大量的磁盘空间。
我觉得我应该分享这个东西,供那些想要使用复制/粘贴代码的人使用。
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);
SpriteBatch
着色器并更改片段着色器,使其平均rgb
分量。(您可以定义自己的ShaderProgram
并将其提供给SpriteBatch
使用。)将片段着色器的主体更改为以下内容(未经测试,可能无法编译):+ " 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" //
您仍然需要加载两个纹理(一个彩色,一个灰度),但它们可以使用相同的源,并且仅使用每像素1个字节的亮度。
更有效的解决方案是根据P.T.的建议实现着色器,但仅适用于GLES 2。