2016-08-26 11 views
0

2つの三角形を結合して線分を描いています。三角形の各頂点は、さまざまな変数(vec3 vBC)として固有の座標セットを取得します。フラグメントシェーダでは、この変数の値は補間された値であり、三角形内のフラグメントの位置を示しています。この値を使用して、フラグメントが三角形のエッジからどれだけ離れているかを判断します。これは、エッジでアンチエイリアスを行うために使用されます。私はこれらのよう辺BCとDEにアンチエイリアスを適用しておりませんので、これがあるのRect 1のギザギザが内部エッジである enter image description hereOpenGLの重心座標を使用したアンチエイリアス線

お知らせ:

は、下の画像に問題を参照してください。長さxは非常に小さいので、頂点CおよびDに近いエッジBCおよびDEのギザギザのエッジが見えるようになります。これらのぎざぎざのエッジは、長さxよりも長さが長い。これらの2つのエッジ(BCとDE)にアンチエイリアスを適用すると、Rect 2が表示されます。これは、アンチエイリアス処理中のスムージング処理が0.0のアルファ値をエッジの上または近くにあるフラグメントに割り当てるためです。したがって、アンチエイリアス処理されたBCとDEは、内側に白い対角線を導入します。

私の質問はどのように私はおそらくRect 1を滑らかにすることができますか?

フラグメントシェーダ:シェーダコードで

varying vec4 DestinationColor; 
varying vec2 TexCoordOut; 
varying vec3 vBC; 
uniform sampler2D Texture; 
uniform int TexEnabled; 
float edgeFactor(); 

void main() { 
    if (TexEnabled == 1) { 
    gl_FragColor = texture2D(Texture, TexCoordOut) * DestinationColor; 
    } else{ 
    gl_FragColor = vec4(DestinationColor.xyz, edgeFactor()); 
    } 
} 

float edgeFactor() { 
    vec3 d = fwidth(vBC); 
    vec3 a3 = smoothstep(vec3(0.0), d*1.5, vBC); 
    return a3.y; 
}; 

、a3.y座標即ちYの組の2番目の値(頂点DまたはCと断片との間の距離)を意味し、D 1(0表します1,0)、最初の0と2番目の0はそれぞれxとzを表します。

+0

"* Rect 1のギザギザのエッジに注意してください。*"いいえ、私はちょうど2つのコーナーに若干の汚れがある黒い矩形を見ます。 –

+0

これは私がopenglから得たオリジナルの出力ではありません。私はちょうどギザギザのエッジの位置を表示しようとしました。これらの「汚れ」は、実際にはBCおよびDEの鋭いエッジである。私はあなたがラインBCとDE – asad

+0

のギザギザのエッジを見ることができることを願っています "*私はOpenGLから取得した元の出力ではありません*"だから、あなたはあなたが提供したイメージには表示されていない、ギザギザのエッジについて質問しています。 –

答えて

0

アルゴリズムはほとんど音ですが、単純なジオメトリではできない内部エッジと外部エッジを区別する手段が必要です。内部エッジに寄与する頂点がいくつかの固有の属性を持つことができるように、頂点を複製する必要があります。それは高価だと言われました...

小さなテクスチャを作成すると、線の幅に沿って適用されるエッジに向かって透明なアルファ値を持つことが簡単になるかもしれません。これは、特に、遅延ジオメトリ処理を伴うモバイル上の、頂点ごとの追加のデータすべてより速いことがあります。

関連する問題