最直接的方法是创建一个 VBO,其中包含您希望使用 GL_LINES 绘制的所有线的世界空间点。
最简单的是使用 glDrawArrays。如果您有大量的对象对需要 (10.000s+) 之间的线,那么将所有点存储在 VBO 中可能是有意义的,然后使用 IBO(索引缓冲区)来说明 VBO 中的哪些点通过线。
线顶点仍然必须通过视图矩阵进行转换。
这是一个例子:GLuint vao, 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);
If you need to add more point-pairs during runtime, update the std::vector, bind the VBO and call glBufferData.