2017-11-22 12 views
0

この画像のような円の円の描き方は? 達成方法や提案はありますか?OpenGL ES点線の円の円の描画

必須ではありませんが、Androidで描画したいと思います。

circular line circle

+0

私は、CPUによって配置されたテクスチャのないテクスチャの束として実装し、1回の描画呼び出しで起動します。各クワッドはGL_TRIANGLESを使用して4つの頂点と6つのインデックスになります。 – Columbo

+0

@Columbo nice approach!円の形状に従って指標や頂点を計算する方法はありますか? – saiday

+0

私はpngのクワッドを描くことはそれをしないだろうと推測しています。どのような「コントロール」がサークル上で欲しいのですか? – Andreas

答えて

0

あなたは、単に色の四角形を描画することで、これを描くことができます。四角形を描画する方法を作成し、四角形ごとに呼び出すか、すべての頂点データを保持するバッファを作成して一度呼び出します。

最初の手順では、最も簡単な方法は行列を使用することです。 angleの矩形をheightととし、内側の円がradiusであるとします。今、あなたが必要とするすべてのように、単一の矩形の頂点バッファである:

{ 
    0.0, -0.5, 
    0.0, 0.5, 
    1.0, -0.5, 
    1.0, 0.5 
} 

これは、線を描画するために完全に配置された1x1のキューブを表します。ここでは、画面の中央に線を引く線を識別する行列を使用します。そして、何が必要角度に回転させ、それは内側の円の外に、それ何が必要サイズに終わりスケールであるので、前方に移動します。

Matrix4x4 matrix = Matrix4x4.identity // Start with identity 
matrix = matrix.rotate(angle, 0, 0, 1) // Rotate around Z 
matrix = matrix.translate(radius, 0, 0) // Translate it forward, this is not a bug 
matrix = matrix.scale(height, width, 1.0) // Scale it 

これはそれをする必要があります。描画にあるパフォーマンスを追加する場合は、1回の描画呼び出しで1つのバッファを作成する必要があります。それでもまったく同じ手順を使用できますが、元の頂点データをCPU上のターゲットマトリックスで変換し、その結果を配列にパックします。

画像の下端(内側)が円形である必要があるかどうかはわかりません。これを実現する最も簡単な方法は、まずアルファマスクを描画し、それをブレンドに使用することです。これを達成するには、色を(1,1,1,1)にクリアする必要があります。次に、カラーマスク(FALSE, FALSE, FALSE, TRUE)(ONE, ONE)とをブレンドして、(0,0,0,0)のような透明な色を使用して、アルファチャンネルにのみ円を描きます。これにより、あなたの背景は完全に白くなりますが、中央にアルファがゼロの円が表示されます。そこで、(TRUE, TRUE, TRUE, TRUE)を使用してデフォルトのマスク設定に戻して、(DST_ALPHA, ONSE_MINUS_DST_ALPHA)のブレンドで四角形を描画してください。これは真ん中に正しい円を表示するために四角形をうまくカットするはずです。 アルファチャンネルの代わりにステンシルバッファに描画するような、より堅牢な手順がいくつか存在します。