【问题标题】:Libgdx, Alpha Text using Shader not workingLibgdx,使用着色器的 Alpha 文本不起作用
【发布时间】:2014-09-05 14:28:15
【问题描述】:

我在使用舞台动作在文本(带有着色器)中应用 alpha 时遇到了一些问题。我正在使用添加窗口演员和窗口添加标签演员的组。我组中的其他演员在应用 Actions alpha 时工作正常,但我的标签(使用着色器绘制)不起作用,与其他小部件的不同之处在于我的文本标签正在应用着色器。

font.frag uniform 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 libgdx shader


    【解决方案1】:

    我不是着色器专家,但我以一种简单的方式成功地完成了这项工作。 (我可能会很困惑)。

    在我的 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 值(你可以在你的标签类中的 draw 方法中这样做)

    sb.setShader(fontShader);
    fontShader.setUniformf("u_newAlpha", Main.newAlph);
    

    因此,即使正在渲染的其他所有内容的 alpha 发生变化,此着色器也会使用它所具有的 alpha 渲染您正在渲染的任何内容。

    在我的中,我使用主类中的公共变量,但您的 draw 方法将 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);          
        }
    

    让我知道这是否有意义!

    【讨论】:

    • 好的,它适用于 alpha 着色器,但现在我遇到了麻烦,我的所有精灵都使用相同的着色器覆盖 1 个着色器的 alpha。
    • 即 1 个标签我想要 0.5f alpha,另一个我想要 1f alpha(但它不能)它覆盖所有标签有 0.5f alpha。
    • 好的,现在它工作了,我只是使用Assets.assetFont.fontShader.setUniformf("u_newAlpha", parentAlpha); 在字体中使用着色器的每个代码。谢谢:D
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多