6

頂点配列を使用して、多数の頂点を含む適度に大きなメッシュを描画しようとしています。テクスチャはこれらから決定されており、次の線に沿って即時モードで描画するのは簡単です。

glBegin(GL_TRIANGLES) {
  for ( int faceIdx = 0; faceIdx < nFaces; ++faceIdx )
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);      
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);  
  }   
} 
glEnd();

ただし、読みやすさ、速度、その他の点で、頂点配列を使用したいと思います(VBOへの移行を目的としています)。単一の頂点を配列に複数回配置することを回避する方法はありますか?

現時点で理解しているように、メッシュの各頂点はメッシュの面に表示される回数だけ指定する必要があります。これは、各頂点が複数のテクスチャ座標を識別するためです(テクスチャは実際の画像からキャプチャされます。メッシュが近似するオブジェクト)、つまり、頂点/頂点座標配列は、即時モードで塗りつぶしたかのように読み取ります。

冗長な(つまり、繰り返される)頂点を使用せずに、テクスチャ座標を指定しながら頂点配列を使用する方法はありますか?

4

2 に答える 2

6

1 つの頂点は、この 1 つの頂点を構成するすべての属性で構成されます。したがって、同じ位置を共有するがテクスチャ座標が異なる 2 つの頂点は、概念的には異なる頂点です。いいえ、異なる texCoords に対して頂点位置を繰り返す簡単な方法はありません。

ただし、通常、このような頂点の複製は、いくつかのまれな領域でのみ必要です (法線が異なるため、シャープなエッジ、またはあなたの場合はテクスチャの継ぎ目など)。では、すべての顔の角が本当に異なる texCoords を持っているのでしょうか? おそらく、データを少し前処理して、位置texCoords を共有し、頂点を共有できる隣接面を見つけることができます。それが多くの頂点に当てはまらず、複製された頂点の小さな束だけになってしまうとしたら、私は驚かれることでしょう。

于 2011-09-02T15:59:57.277 に答える
-1

あなたの質問が正しいことを理解していれば、同じ頂点を何度も頂点バッファーに入れる必要をなくす方法が実際にあります。インデックス バッファを使用し、インデックスを使用して同じ頂点を指定できます。これにより、レンダリングが大幅に高速化されます。

于 2011-09-02T15:23:08.450 に答える