3

テキストの周囲に境界線を配置するシェーダーを作成しようとしています。コンパイルして正常に実行されますが、境界線は粗く、エイリアス化されています。それをより良くするための提案はありますか?

シェーダー

これは私が書いた最初のシェーダーなので、APIについてあまり知識がありません。サンプルコードにコメントをお願いします。答えをコピーして貼り付けるだけではありません。理解したいのですが。

さらに、この画像で最もよく説明されているテキストを小さくすると問題が発生します。これを修正するための提案もありますか?

シェーダー

エッジ検出も優れている可能性があります。これまでのところ、入力に使用するアンチエイリアスされたテクスチャにはエッジがあります。0.0 < alpha < 1.0

これまでのところ私はこれを持っています:

#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform vec4 u_borderColor;
uniform float u_width;
uniform float u_height;

void main()
{
    mediump vec4 total = vec4(0.0);

    float alpha = texture2D(u_texture, v_texCoord).a; 
    //If somewhere between complete transparent and completely opaque
    if (alpha > 0.0 && alpha < 1.0)
    {
        total.rgb = u_borderColor.rgb;
        total.a *= u_borderColor.a;
        gl_FragColor = u_borderColor;
    }
    else
    {
        gl_FragColor = texture2D(u_texture, v_texCoord);
    }
}
4

2 に答える 2

4

gl_FragColorの値をtotalに設定しないのはなぜですか?アルファはもはや正しく維持されていません...

次に、total.a=1-アルファ; (外側から内側へ)

または次のようなバリアント:

total.a = abs(0.5-alpha); (両側をブレンド)

ブレンドするときは、おそらくもっと理にかなっているでしょう。

于 2012-06-20T18:34:42.707 に答える
0

コードでは、アルファが。の場合、合計からの設定gl_FragColor = u_borderColorであることがわかります。まず、合計を他のコントラストカラーに変更すると、コードが画像に対して機能します。ただし、テキストにはさまざまな曲がりがあり、粒子が粗くなるため、コードなしでは言えないレンダリングを変更する必要があります。私が間違っているかどうかを提案してくださいありがとう(0,0,0,0)>0 <1

于 2012-06-21T01:08:25.183 に答える