我在使用舞台操作在文本(使用着色器)中应用 Alpha 时遇到一些问题。我正在使用添加窗口 Actor 和窗口添加标签 Actor 的组。我组中的其他 Actor 应用 Actions alpha 工作得很好,但我的标签(使用着色器绘制)不起作用,与其他小部件不同的是我的文本标签正在应用着色器。
字体.frag 统一sampler2D u_texture;
varying vec4 v_color;
varying vec2 v_texCoord;
const float smoothing = 0.2;
void main() {
float distance = texture2D(u_texture, v_texCoord).a;
float alpha = smoothstep(0.5 - smoothing, 0.5 + smoothing, distance);
gl_FragColor = vec4(texture2D(u_texture, v_texCoord).rgb, alpha);
}
字体.vert
uniform mat4 u_projTrans;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_color;
varying vec4 v_color;
varying vec2 v_texCoord;
void main() {
gl_Position = u_projTrans * a_position;
v_texCoord = a_texCoord0;
v_color = a_color;
}
我的标签将标签从 Libgdx 扩展到应用着色器,
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.Batch;
public class Label extends com.badlogic.gdx.scenes.scene2d.ui.Label {
boolean shaderActive = false;
public Label(CharSequence text, LabelStyle style) {
super(text, style);
if(style.font.getScaleX() > 1f)
shaderActive = true;
}
@Override
public void draw(Batch batch, float parentAlpha) {
if(shaderActive) {
batch.setShader(Assets.assetFont.fontShader);
}
super.draw(batch, parentAlpha);
batch.setShader(null);
}
}
工作代码
private void initStage() {
// TODO Stage Here
stage = new Stage();
stage.setViewport(viewport);
Window w2 = new Window("",
new WindowStyle(Assets.assetFont.blackBoldVSmall, Color.BLACK,
new Image(Assets.assetHUD.windowFrame).getDrawable()) );
w2.setSize(1200, 675);
w2.setPosition(40, 0);
Label lbl2 = new Label("Touch here to Jump !", new LabelStyle(Assets.assetFont.goldBoldNormal, Color.GRAY));
lbl2.setPosition(Settings.width/2, Settings.height/2);
w2.add(lbl2);
groupTouchHere.addActor(w2);
stage.addActor(groupTouchHere);
// sequence of action
SequenceAction sequence = new SequenceAction(
Actions.fadeIn(0.4f, Interpolation.circleOut),
Actions.fadeOut(0.4f, Interpolation.circleIn));
SequenceAction sequenceTotal = new SequenceAction(sequence, Actions.repeat(4, sequence));
groupTouchHere.addAction(sequenceTotal);
}
public void update(float deltaTime){
stage.act();
}
最佳答案
我不是着色器专家,但我已经以我认为简单的方式成功地完成了这项工作。 (我可能很困惑)。
在我的 java 代码中,我的 Main 函数中有一个变量,用于保存 alpha 值(我只使用一个用于游戏状态转换):
public static float newAlph = 1;
在我的 *.vert 文件中,我声明了一个统一变量以将 alpha 作为输入,然后将其值设置为可变变量,以便 .frag 文件获取它。
...
uniform float u_newAlpha;
varying float v_newAlpha;
...
void main() {
...
v_newAlpha = u_newAlpha;
}
然后在 .frag 文件中我声明相同的变化变量并简单地乘以 alpha。
...
varying float v_newAlpha;
...
void main() {
...
gl_FragColor = vec4(v_color.rgb, alpha*v_newAlpha);
}
最后,当调用着色器时,我设置了 alpha 值(您可以在绘制方法的标签类中执行此操作)
sb.setShader(fontShader);
fontShader.setUniformf("u_newAlpha", Main.newAlph);
因此,即使正在渲染的其余所有内容的 alpha 正在更改,此着色器也会使用它所具有的 alpha 渲染您正在渲染的任何内容。
在我的中,我使用主类中的公共(public)变量,但您的绘制方法将 alpha 作为输入,因此将其设置为 .vert 文件内的统一变量应该可以工作。
这样你就会:
public void draw(Batch batch, float parentAlpha) {
if(shaderActive) {
batch.setShader(Assets.assetFont.fontShader);
}
Assets.assetFont.fontShader.setUniformf("u_newAlpha", parentAlpha);
super.draw(batch, parentAlpha);
batch.setShader(null);
}
请告诉我这是否有意义!
关于java - Libgdx,使用 Shader 的 Alpha 文本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688200/