Libgdx,Alpha文本使用着色器不起作用

问题描述:

我在使用舞台动作在文本(着色器)中应用alpha有一些麻烦。我正在使用添加窗口角色和窗口添加标签角色的组。我的另一个演员在组中工作正常,应用Actions alpha但我的标签(使用着色器绘制)不工作,与其他小部件的不同之处在于我的文本标签正在应用着色器。Libgdx,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); 
} 

font.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代码,我在我的主要功能是持有阿尔法值的变量(我只用一个游戏状态转变):

public static float newAlph = 1; 

在我* .vert文件,我宣布一个统一的变量取alpha作为输入,然后将其值设置为变量变量,以便.frag文件获取它。

... 

uniform float u_newAlpha; 
varying float v_newAlpha; 

... 

void main() { 
    ... 
    v_newAlpha = u_newAlpha; 
} 

然后在.frag文件中,我声明相同的变量,并简单地乘以阿尔法。

... 
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作为输入,因此将.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);   
    } 

让我知道,如果是有道理的!

+0

确定它适用于alpha着色器,但现在我遇到了麻烦,我的所有精灵都使用相同的着色器覆盖1着色器中的alpha。 – RaditzLawliet 2014-09-09 08:51:55

+0

即1个标签我想0.5f阿尔法,另一个我想要1f阿尔法(但它不能)它覆盖所有标签有0.5f阿尔法。 – RaditzLawliet 2014-09-09 08:52:39

+0

好吧,现在它工作,即时通讯使用 'Assets.assetFont.fontShader.setUniformf(“u_newAlpha”,parentAlpha);' 字体使用着色器。感谢:D – RaditzLawliet 2014-09-09 14:45:31