首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >libgdx中的纹理灰度

libgdx中的纹理灰度
EN

Stack Overflow用户
提问于 2013-07-08 04:40:40
回答 3查看 2.5K关注 0票数 5

有没有办法将libgdx的纹理转换成灰度图像?到目前为止,我已经复制了我想要灰度化的图像,并手动完成了,但我认为这不是最好的解决方案,因为我的游戏使用了越来越多的图像,并且它使用了大量的磁盘空间。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-08 07:50:50

您应该能够编写一个GLSL着色器,以灰度渲染纹理。这需要OpenGL 2.x,并且并不真正“转换”纹理,而只是将其渲染为灰度。

有关包含灰度着色器的着色器的详细教程,请查看:https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson3

(Libgdx并没有真正定义GLSL shader API,它是从OpenGL传递过来的,所以你在网上找到的大多数常规OpenGL的教程或代码都应该可以用。)

要获得更直接的技巧,只需使用the Libgdx SpriteBatch shader并更改片段着色器,使其平均rgb组件。(您可以定义自己的ShaderProgram并将其提供给SpriteBatch使用。)将片段着色器的主体更改为类似以下内容(未经测试,因此可能无法编译):

代码语言:javascript
运行
复制
+ "  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" //
票数 7
EN

Stack Overflow用户

发布于 2014-04-07 19:45:02

我想把这篇文章分享给任何想要使用一些复制/粘贴代码的人。

代码语言:javascript
运行
复制
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);
}

要使用它,请呼叫

代码语言:javascript
运行
复制
spriteBatch.setShader(GrayscaleShader.grayscaleShader)

当你用完灰度后,别忘了打电话给我

代码语言:javascript
运行
复制
spriteBatch.setShader(null);
票数 9
EN

Stack Overflow用户

发布于 2013-07-08 10:32:14

可以将纹理加载为仅亮度,或以GLES为单位的亮度和alpha (请参见glTexImage2D)。在libgdx中,您可以在实例化Texture时指定PixFormat.Intensity (亮度)或LuminanceAlpha (亮度和alpha)。这将生成灰度纹理。

您仍然需要加载两个纹理(一个颜色,一个灰度),但它们可以使用相同的源,并且在内存中每个像素的亮度仅使用1个字节。一种更有效的解决方案是实现P.T.建议的着色器,但仅在GLES 2中可用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17516177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档