gpt4 book ai didi

java - LibGDX:使用皮肤为图像按钮着色图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:47 25 4
gpt4 key购买 nike

你好,我想制作一个 ImageButton,禁用的图像应该是灰色的。我使用皮肤和 .json 文件来定义它。有没有比复制所有图像并将它们添加到 texturepacker 更好的方法来获得灰色图像?

最佳答案

我认为实现此目的的最佳方式(甚至是唯一方式)是使用 shaders .请注意,着色器 本身就是一个完整的主题,但一旦掌握甚至熟悉,就可以为您的游戏提供许多很酷的功能,例如使图像变灰。

关于您的问题:首先需要的是着色器,它们会影响您的图像(或者,在我们的例子中,ImageButton),并将它们染成灰色。幸运的是,这些着色器已由其他人实现,作为对 similar question 的回答。 .因此,如果我们从上面提取所需的着色器,我们将得到以下内容:

灰色.vsh:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;

varying vec4 vColor;
varying vec2 vTexCoord;
void main() {
vColor = a_color;
vTexCoord = a_texCoord0;
gl_Position = u_projTrans * a_position;
}

grey.fsh:

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 vColor;
varying vec2 vTexCoord;
uniform sampler2D u_texture;
uniform float grayscale;
void main() {
vec4 texColor = texture2D(u_texture, vTexCoord);

float gray = dot(texColor.rgb, vec3(0.96, 0.96, 0.96));
texColor.rgb = mix(vec3(gray), texColor.rgb, grayscale);

gl_FragColor = texColor * vColor;
}

假设这些文件在您的 assets 文件夹中,我们可以创建一个 ShaderProgram将编译和使用这些着色器:

ShaderProgram shader = new ShaderProgram(Gdx.files.internal("grey.vsh"), Gdx.files.internal("grey.fsh"));

现在我们可以扩展 ImageButton,以便在我们希望它变灰时使用 shader。在此示例中,ImageButton 在被单击时变灰(或变色):

public class GreyedOutImageBtn extends ImageButton {
private boolean isGreyedOut; // A flag that determines whther or not this should be greyed out
public GreyedOutImageBtn(ImageButtonStyle style) {
super(style);
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
// When clicked, toggle the grey effect
Gdx.app.log("ClickListener", "Click");
setIsGreyedOut(!getIsGreyedOut());
}
});
isGreyedOut = false;
}

public boolean getIsGreyedOut() {
return isGreyedOut;
}

public void setIsGreyedOut(boolean isGreyedOut) {
this.isGreyedOut = isGreyedOut;
}

@Override
public void draw(Batch batch, float parentAlpha) {
if (getIsGreyedOut()) {
batch.end();
batch.setShader(shader); // Set our grey-out shader to the batch
batch.begin();
super.draw(batch, parentAlpha); // Draw the image with the greyed out affect
batch.setShader(null); // Remove shader from batch so that other images using the same batch won't be affected
}
else {
// If not required to be grey-out, do normal drawing
super.draw(batch, parentAlpha);
}
}
}

这给出了以下结果。之前:

enter image description here

之后:

enter image description here

在您更好地理解着色器之后,您可以构建自己的着色器以满足您的特定需求。

关于java - LibGDX:使用皮肤为图像按钮着色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32298461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com