私は現在GL_LINES
、均一な半径で大量のモデルを使用してモデルを描画しています。これですべてglLineWidth
の線の半径が変わることはわかっていますが、それぞれの半径は異なるはずです。(別の方法で)または別の機能を使用して可能かどうか疑問に思っていますか?他にどうすればいいですか?glLineWidth
1 に答える
それらを特別に構築された三角形のストリップとしてレンダリングします。具体的には、各線分を三角形のペアとしてレンダリングし、四角形の長さが線の長さに一致し、幅が「半径」に一致する四角形を形成します。ただし、本当の秘訣は GL_LINES をシミュレートすることです。これは、線分が必ずしも互いに接続されている必要がないためです。三角形ストリップの場合にこれを行うには、三角形のペアを面積ゼロの三角形に接続する必要がありますが、これはレンダリングされません (OpenGL ES 実装が準拠していない場合を除きます)。
たとえば、2D であると仮定すると (簡単にするために、3D もほぼ同じです)、以下に示すように、線分の 1 つに端点 (x1,y1) と (x2,y2) があり、幅が W であるとします。
これをクワッドに置き換えるには、コーナーの座標を決定する必要がありますが、これには少し計算が必要です。適切な 2D ベクトル クラスについては、vec2
vec2 p1(x1, y1);
vec2 p2(x2, y2);
vec2 v = p2 - p1;
v /= v.length(); // make it a unit vector
vec2 vp(-v.y, v.x); // compute the vector perpendicular to v
vec2 v[4];
v[0] = p1 + W/2 * vp;
v[1] = p1 - W/2 * vp;
v[2] = p2 + W/2 * vp;
v[3] = p2 - W/2 * vp;
// Load the v[] array into a vertex-buffer object
これにより、単一のラインをクワッドに入れるソリューションが提供されます。それらを接続するには、縮退三角形を含む三角形ストリップを作成する必要があります。これを を使用して描画するとglDrawElements
、単純なインデックス配列を作成してこれを行うことができます。上記のように 2 つの線分をクワッドに変換し、頂点 v[0] ... v[7] を与えたとします。それらを単一の三角形ストリップにするには、次のインデックス リストを作成します。
{ 0, 1, 2, 3, 3, 4, 5, 6, 7 }
リスト内の '3' を 2 回繰り返すことで、他の三角形を接続する新しい三角形を作成しますが、表示されません。クワッドの最後の頂点を繰り返すと、GL_LINES のセット全体を単一の三角形ストリップとしてレンダリングできます。