2016-04-09 6 views
2

TextButtonフォントのためのカスタムシェーダ:https://github.com/libgdx/libgdx/wiki/Distance-field-fontslibGDX - この記事で説明したように、私は距離フィールドのフォントを使って実験してきた

すべてが、私はちょうどフォントをレンダリングしていたときに正常に動作しますが、私はシェーダを使用しようとすると、 TextButtonでは、ボタンだけが白くなります。これは、テキストだけでなく、ボタン全体にシェーダを適用しているためです。私は周りを見回しましたが、TextButtonのテキストだけでシェーダを変更する方法に関する情報を見つけることができませんので、ここで私は尋ねています。 TextButtonのテキストレンダリングにカットムシェイダーを適用するにはどうすればよいですか?

初期コード:

textShader = new ShaderProgram(Gdx.files.internal("graphics/shaders/font/font.vert"), 
      Gdx.files.internal("graphics/shaders/font/font.frag")); 
//exact same shaders as linked article 
stage = new Stage(); 
stage.getBatch().setShader(textShader); 
//Setting the shader for the stage will set the shader for everything in the stage, 
//like my labels/buttons etc. This works fine for my labels as they are plain text, 
//but my buttons become completely white. 

init the rest of my labels, buttons, batches etc... 

レンダリングコード:

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL_COLOR_BUFFER_BIT); 

render background/other stuff... 

stage.act(delta); 
stage.draw(); 

フラグメントシェーダ:

#ifdef GL_ES 
precision mediump float; 
#endif 

uniform sampler2D u_texture; 

varying vec4 v_color; 
varying vec2 v_texCoord; 

const float c_width = 0.5; 
const float c_edge = 0.1; 

const vec2 c_offset = vec2(0); 

const float c_borderWidth = 0.5; 
const float c_borderEdge = 0.5; 

const vec3 c_color = vec3(0.7, 0.3, 0.1); 
const vec3 c_outlineColor = vec3(0.3); 

void main() { 
    float distance = 1.0 - texture(u_texture, v_texCoord).a; 
    float alpha = 1.0 - smoothstep(c_width, c_width + c_edge, distance); 

    float distance2 = 1.0 - texture(u_texture, v_texCoord + c_offset).a; 
    float outlineAlpha = 1.0 - smoothstep(c_borderWidth, c_borderWidth + c_borderEdge, distance2); 

    float overallAlpha = alpha + (1.0 - alpha) * outlineAlpha; 
    vec3 overallColour = mix(c_outlineColor, c_color, alpha/overallAlpha); 

    gl_FragColor = vec4(overallColour, overallAlpha); 
} 

バーテックスシェーダ:

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; 
} 
+0

コードをご覧ください。 –

+0

私はいくつかのコードを追加しました。また、TextButtonのテキストも問題ないことに注意してください。これは、ボタンの背景がちょうどうんざりしています。 – Charanor

答えて

3

距離フィールドシェーダは他のものを正常にレンダリングできません。 scene2Dで使用するには、ラベルを描画するときにのみこのシェーダに一時的に切り替える必要があるため、シェーダを交換できるLabelのサブクラスを作成する必要があります。たぶん、このような何か:

public class CustomShaderLabel extends Label { 
    private ShaderProgram shader; 
    public CustomShaderLabel(CharSequence text, Skin skin) { 
     super(text, skin); 
    } 

    public CustomShaderLabel(CharSequence text, Skin skin, String styleName) { 
     super(text, skin, styleName); 
    } 

    public CustomShaderLabel(CharSequence text, Skin skin, String fontName, Color color) { 
     super(text, skin, fontName, color); 
    } 

    public CustomShaderLabel(CharSequence text, Skin skin, String fontName, String colorName) { 
     super(text, skin, fontName, colorName); 
    } 

    public CustomShaderLabel(CharSequence text, LabelStyle style) { 
     super(text, style); 
    } 

    public ShaderProgram getShader() { 
     return shader; 
    } 

    public void setShader(ShaderProgram shader) { 
     this.shader = shader; 
    } 

    public void draw (Batch batch, float parentAlpha) { 
     if (shader != null) batch.setShader(shader); 
     super.draw(batch, parentAlpha); 
     if (shader != null) batch.setShader(null); 
    } 
} 

あなたは多くのラベルを持つ複雑な階層構造を持っている場合は問題になる可能性のラベルが、あるところはどこでも、これは余分なバッチ・フラッシュを引き起こすことに留意してください。

TextButtonは独自のLabelタイプを使用することを知らないので、標準のButtonを使用してLabelを追加するか、TextButtonクラスのほとんどをコピーして貼り付けて独自のバージョンを作成する必要がありますTextButton.TextButtonStylesを使用して、ボタン内のLabelのスタイルを設定することができます)。

+0

これはうまくいきましたが、私のラベルは自分のアクションを使わない(フェードイン/フェードアウト/アルファを変更しない)という問題があります。どんな解決策ですか? – Charanor

+0

そのリンクのシェーダーを使用している場合は、最後の行のアルファをalpha * v_color.aに置き換えてください。 – Tenfour04

+1

同じシェーダを使用していませんが、代わりにコード全体でoverallAlpha * v_color.aを実行しました。ありがとう! – Charanor