OpenGL着色:两个对象,一个线来连接它们(openGL shader: two object a

2019-09-19 23:53发布

我使用的着色器和可编程管线,我需要两个网格带线(也许有色)连接,但我只是有这两个对象的模型矩阵。 该行应在这些对象的中心开始,所以我认为这两个点的对象COORDS应该是:

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

两个连接对象我想我会通过其各自的对象模型矩阵相乘在着色器这些点。 然后乘以视图矩阵一切(这是常见的两个对象)。 并最终由投影矩阵。

我一直使用顶点数组着色器,我将如何通过两个不同的顶点着色器? 我应该使用的制服对他们来说太? 我应该用什么功能划清界线,因为两个glDrawElements和调用glDrawArrays需要一个数据阵列?

Answer 1:

最简单的方法是创建一个包含所有你希望与GL_LINES画线的世界空间点VBO。

最简单的方法是使用调用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);

如果你需要在运行时添加更多的点对,更新的std ::载体,结合VBO并调用glBufferData。



文章来源: openGL shader: two object and one line to connect them