最も簡単な方法は、GL_LINESで描画するすべての線のワールドスペースポイントを含むVBOを作成することです。
最も簡単なのはglDrawArraysを使用することです。(10.000s +)の間に線を必要とするオブジェクトのペアが極端に多い場合は、すべてのポイントをVBOに格納してから、IBO(インデックスバッファー)を使用して、VBO内のどのポイントがライン。
線の頂点は、ビューマトリックスによって変換する必要があります。
次に例を示します。GLuintvao、vbo;
// generate and bind the vao
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// generate and bind the buffer object
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
struct Point{
float x,y,z;
Point(float x,float y,float z)
: x(x), y(y), z(z)
{}
};
// create two points needed for a line. For more lines, just add another point-pair
std::vector<Point> vertexData;
vertexData.push_back( Point(-0.5, 0.f, 0.f) );
vertexData.push_back( Point(+0.5, 0.f, 0.f) );
// fill with data
size_t numVerts = vertexData.size();
glBufferData(GL_ARRAY_BUFFER, sizeof(Point)*numVerts, &vertexData[0], GL_STATIC_DRAW);
// set up generic attrib pointers
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, numVerts*sizeof(Point), (char*)0 + 0*sizeof(GLfloat));
// "unbind" vao
glBindVertexArray(0);
// In your render-loop:
glBindVertexArray(vao);
glDrawArrays(GL_LINES, 0, numVerts);
実行時にポイントペアを追加する必要がある場合は、std :: vectorを更新し、VBOをバインドして、glBufferDataを呼び出します。