0

我正在使用着色器和可编程管道,我需要用一条线(可能是彩色的)连接两个网格,但我只有这两个对象的模型矩阵。这条线应该从这些对象的中心开始,所以我假设两点的对象坐标应该是:

start point: 0,0,0
end point: 0,0,0

为了连接这两个对象,我假设我必须将着色器中的这些点乘以它们各自对象的模型矩阵。然后将所有内容乘以视图矩阵(这对两个对象来说很常见)。并最终由投影矩阵。

我一直使用带顶点数组的着色器,如何将两个不同的顶点传递给着色器?我也应该为他们穿制服吗?由于 glDrawElements 和 glDrawArrays 都需要数据数组,我应该使用什么函数来绘制线?

4

1 回答 1

2

最直接的方法是创建一个 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.

于 2012-07-21T19:10:25.897 回答