2

私はEigen3 2次元ベクトルをopengl描画の2Dポイントとして使用し、それらをリストに保存しています:

typedef Eigen::Vector2d Vec2D;
std::list<Vec2D> points;

ここで、生の float 座標値のデータ構造全体をグラフィック カードに渡すために、GLfloat の配列が必要です。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

_vertex = new GLfloat[points.size()*2];
_colors = new GLfloat[points.size()*4];

std::list<Vec2D>::const_iterator it;
int i=0, j=0;
for(it=points.begin(); it!=points.end(); ++it) {
    _vertex[i] = it->x()+2;
    _vertex[i+1] = it->y()+2;
    i+=2;

    _colors[j] = getRed(j/4.0f, it);
    _colors[j+1] = getGreen(j/4.0f, it);
    _colors[j+2] = getBlue(j/4.0f, it);
    _colors[j+3] = getAlpha(j/4.0f, it);
    j+=4;
}

glColorPointer(4, GL_FLOAT, 0, _colors);
glVertexPointer(2, GL_FLOAT, 0, _vertex);
glDrawArrays(GL_LINE_STRIP, 0, points.size());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

delete _vertex;
delete _colors;

グラフィックカードに渡す配列を作成するためのより効率的な方法はありますか? 通過points.begin()してオフセットが何であるかを調べ、すべてのポイントをループするのを避けるように?

つまり..メモリでは、のx座標とy座標をEigen::Vector2d連続したスペースに保存する必要があります..だから..グラフィックカードに直接渡すことができると思います..しかし、私はその方法を理解できません.

4

2 に答える 2

4

std::list は連続したメモリにデータを保持しません。そのためには std::vector が必要です (または、コンパイル時にサイズがわかっている場合は std::array が必要ですが、おそらくわかりません)。Vector には、基になるデータへのポインターを返すメソッド data() があります。ただし、Eigen::vec2d を内部に保存する場合、それを openGl に渡すことはできません。これは動的構造であり、データがメモリ全体に存在するためです。データを所定の位置に保持する構造が必要です(ところで、vec2d よりも読みやすいですが、このコンテキストではちょっと奇妙です)。例えば:

struct VertexData
{
    GLfloat x;
    GLfloat y;
    GLfloat red;
    GLfloat green;
    GLfloat blue;
    GLfloat alpha;    
}

そして glVertexPointer を使用して、 sizeof(VertexData) をストライドとして使用して openGL に渡します

新しい配列を削除するには、使用する必要があります

delete [] _vertex;

通常の削除では、最初の要素のみが解放されます。または、さらに良いことに、スマートポインターを使用できます。この場合、 std::unique_ptr が最適です

std::unique_ptr<GLfloat[]> _vertex(new GLfloat[points.size() * sizeof(GLfloat)]);

範囲外になると(ブロックの最後で)自動的にメモリを解放します

于 2013-06-29T15:57:03.387 に答える
2

pointsであるstd::listため、データの連続した配列は含まれません。

ただし、代わりにを使用するstd::vectorと、C++11 では で内部的に使用される配列にアクセスできますpoints.data()。これは、もう必要ないことを意味します_vertex

別の方法として、さらに進んでVertex、頂点の位置とその色の両方を含むクラス (たとえば という名前) を作成し、 (with )と組み合わせてdata()メソッドを使用できることを知っておいてください。std::vector<Vertex>glInterleavedArraysstride=sizeof(Vertex)

于 2013-06-29T16:08:44.270 に答える