openGL着色器:两个对象和一条线来连接它们

Posted

技术标签:

【中文标题】openGL着色器:两个对象和一条线来连接它们【英文标题】:openGL shader: two object and one line to connect them 【发布时间】:2012-07-21 18:26:42 【问题描述】:

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

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

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

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

【问题讨论】:

如果你想要很多行(100s,1000s),那么将点作为制服发送是低效的。另外,你会如何画线?有一些方法(几何着色器输出lines_strips或片段着色器测试每个像素),但这不必要地复杂。 好的,如果我需要使用数组,您能否提供一个示例来说明如何做到这一点? 这是同样的问题,但对于固定功能 GL:***.com/questions/11593053/… 【参考方案1】:

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

如果您需要在运行时添加更多点对,请更新 std::vector,绑定 VBO 并调用 glBufferData。

【讨论】:

谢谢!您非常友善,您已经解决了我的问题,再次感谢您!

以上是关于openGL着色器:两个对象和一条线来连接它们的主要内容,如果未能解决你的问题,请参考以下文章

openGL:带着色器的线条

初识OpenGL 链接着色器

初识OpenGL 链接着色器

OpenGL 对象不显示,着色器相关

我的OpenGL学习进阶之旅着色器和程序(下)------ 程序对象

我的OpenGL学习进阶之旅着色器和程序(下)------ 程序对象