有没有办法将libgdx的纹理转换为灰度图像?到目前为止,我已经复制了我想要灰度化的图像,并且手动完成了这些图像,但我认为这不是最好的解决方案,因为我的游戏使用的图像越来越多,并且使用了大量的磁盘空间。纹理灰度在libgdx
3
A
回答
6
您应该可以编写GLSL着色器来呈现灰度纹理。这需要OpenGL 2.x,并不真正“转换”纹理,而只是将其呈现为灰度显示。
有关着色器的详细教程,包括灰度渲染看看:https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson3
(Libgdx并没有真正定义GLSL着色器API,这是一个从OpenGL的穿过,所以大部分的教程或代码,你就找到对于普通的OpenGL应该可以工作。)
对于更直接的破解,只需要the Libgdx SpriteBatch
shader并更改片段着色器,使其平均值为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" //
2
最多可装入纹理作为仅亮度,或GLES中的亮度和alpha(参见glTexImage2D)。在libgdx中,您可以在实例化Texture时指定PixFormat.Intensity(亮度)或LuminanceAlpha(亮度和alpha)。这将生成灰度纹理。
您仍然需要加载两个纹理(一种颜色,一种灰度),但它们可以使用相同的来源,并且亮度仅在内存中每像素使用1个字节。 更有效的解决方案是实现P.T.建议的着色器,但只能从GLES 2获得。
4
想到我会分享这个给任何想要使用一些复制/粘贴代码的人。
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);
相关问题
- 1. Libgdx 3D纹理透明度
- 2. LibGDX - 更改纹理亮度
- 3. 修改纹理的透明度LibGDX
- 4. vulkan中的灰度纹理格式
- 5. LibGdx纹理包装
- 6. libGDX纹理“拉伸”
- 7. 切割纹理libgdx
- 8. Libgdx纹理动画
- 9. LibGDX - 圆形纹理
- 10. 圆形纹理libGdx
- 11. LibGDX纹理渲染顺序
- 12. LibGDX纹理不会绘制
- 13. Android Studio Libgdx黑色纹理
- 14. 居中一个纹理LibGDX
- 15. libGDX阵列纹理错误
- 16. Libgdx游戏 - 纹理缩放
- 17. LibGDX重复纹理区域
- 18. libgdx SpriteBatch渲染到纹理
- 19. 在Android上在OpenGL ES中着色灰度纹理
- 20. 以提高速度在LibGdx中移动纹理
- 21. Libgdx在纹理中保存SpriteBatch
- 22. libgdx在运行时生成纹理
- 23. 纹理封装大小问题在libgdx
- 24. 在网格上添加纹理Libgdx
- 25. 如何在Libgdx中加载纹理?
- 26. 从纹理清除在libgdx从vm
- 27. 如何在opengl中加载灰度4位每像素纹理?
- 28. 如何在Android上渲染灰度纹理?
- 29. LibGdx/Android Studio:管理纹理/纹理大小的最佳方法?
- 30. (Java LibGDX)如何在LibGDX中调整纹理大小?
你真的应该把着色器在一个单独的文件并加载它们(并使用一些整洁的着色器工具),如果你想要一个可维护性可读性恶梦选择这个选项。 –
@iLoveUnicorns同意。但是对于想要快速解决问题的人来说,这不是一个复制/粘贴选项。这并不妨碍他们这样做,这只是朝着正确方向迈出的一步。 –