8

さまざまな機能を示す3Dマップビューのマークアップされた線を描画するアプリケーションがあります。マップをOpenGL-ESアーキテクチャに移植していますが、破線を表示する方法を理解するのに少し問題があります。

多くのグーグルを行って、破線とポリゴンの描画がテクスチャ三角形を使用して簡単にエミュレートできるため、OpenGL-ESから削除されたという考えへの多くの言及を見つけました。それは素晴らしいことですが、実際にこのエミュレーションを行っている人や、関連する手順の説明を持っている人を見つけることができません。

この概念のプロトタイプを作成しようとして私が遭遇した問題の1つの例は、遠近法が私の線を地平線に向かって見えないように絞ることです。LINE_STRIPを使用すると、これは発生せず、線はマップ内で一定の幅のままになります。

透視図で一定幅の破線を実現する方法についてのアドバイスをいただければ幸いです。

4

2 に答える 2

5

三角形だけでなく、線にテクスチャを適用できると思います。線の両端にテクスチャ座標を設定する必要があります。テクスチャは線に沿って直線的に補間されます。

この解決策の有効性は、ラインまたはライン ストリップのどちらを使用しても変わらないはずです。ライン ストリップは、より少ない頂点でラインを作成する方法にすぎません。

もう 1 つの問題があります。ラインがカメラから遠ざかるにつれて、テクスチャ パターンがコンパクトになる傾向があります。これは、テクスチャ座標補間が線に対してもパースペクティブ補正であるためです (GL 仕様のセクション 3.5 を参照)。

これを回避するには、次の 2 つの方法があります。

  1. パースペクティブを元に戻すテクスチャの "q" 座標を計算できる場合は、スクリーン スペース テクスチャリングを復元できます。この手法はおそらくパフォーマンスが高すぎます。

  2. 目の空間にテクスチャを投影できます (glTexGen など)。

もちろん、テクスチャ座標の生成は GLES 1.1 では利用できませんが、頂点を配列で使用している場合は、次のようにして偽装できます。

  • テクスチャ座標配列を頂点座標配列に設定し、
  • テクスチャ マトリックスを使用して頂点を「変換」します。

この手法の欠点は、テクスチャ パターンが固定されたスクリーン スペース内にあることです。つまり、テクスチャがラインをまたいで表示されません。

于 2010-01-28T22:48:42.277 に答える
3

破線を描くことだけが必要な場合は、GL_LINE_STRIP から GL_LINES に変更するだけです。そうすれば、Open GL は頂点 1 と 2、3 と 4、5 と 6 を接続しますが、3 と 4、または 4 と 5 は接続せず、そこにスペースを残します。これは本質的に半分/半分の比率の点線になります。これは glLineStipple(1, 0101); とほぼ同じです。

IE: 頂点配列内

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL は (0,0) を (1,1) に接続しますが、(1,1) を (2,2) に接続しません [GL_LINE_STRIP の場合]。次に、(3,3) を (4,4) に接続しますが、(4,4) を (5,5) に接続しません。最終的な接続は (5,5) から (6,6) になります。

これは私がそれをしたときのように見えます:

Android の点線

私の場合、ゲームフレームごとのゲームエンティティの位置を表すため、線は50/50のドット/空ではありません.ゲームフレームは必ずしもすべて同じ長さではないため、線とスペースの比率に一貫性がありません.

コードは次のようになります。

public void draw(GL10 gl) { gl.glDisable(GL10.GL_TEXTURE_2D);

  gl.glColor4f(color[0], color[1], color[2], color[3] / fade);
          //pointsBuffer holds the points on the line
  gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointsBuffer); 

  gl.glDrawArrays(GL10.GL_LINES, 0, points.length/2);

  gl.glEnable(GL10.GL_TEXTURE_2D);

}

より意図的にパターン化された点描を作成する別のアイデアは、代わりにインデックス配列 (glDrawElements) を使用して描画することにより、特定の頂点をスキップすることです。ただし、お見せできる例はありません。:/

于 2014-02-19T21:37:04.060 に答える