【发布时间】:2015-08-19 09:40:39
【问题描述】:
我能够使用 OpenGL 4.x 中的 VBO 和着色器来渲染以下点。
typedef struct Point
{
double x,y,z,w;
}Point;
std::vector<Point>vPoints;
glBufferData(GL_ARRAY_BUFFER, vPoints.size()* sizeof(Point), &vPoints[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 4, GL_DOUBLE, GL_FALSE, vPoints.size()*sizeof(GLdouble), (GLvoid*)0)
我们如何指定 VBO 使用下面的变量来绘制线串
typedef struct LineString
{
vector<Point> vPointList;
}LineString;
vector<LineString> vLines;
glBufferData(GL_ARRAY_BUFFER, ????, ????, GL_STATIC_DRAW);
glVertexAttribPointer(0, 4, GL_DOUBLE, GL_FALSE, ????, (GLvoid*)0)
我尝试了下面的设置,它似乎不起作用
glBufferData(GL_ARRAY_BUFFER, vLines.size()* sizeof(LineString)*sizeof(Point), &vLines[0].vPointList[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 4, GL_DOUBLE, GL_FALSE, vLines.size()*sizeof(GLdouble), (GLvoid*)0);
我以为我几乎用下面的 VBO 创建代码到达那里
for(int i=0;i< vLines.size();i++)
pt_count += vLines[i].vPointList.size();
fprintf( stdout, "Total point Count: %d\n", pt_count);
glBufferData(GL_ARRAY_BUFFER, pt_count * sizeof(Point), nullptr, GL_STATIC_DRAW);
size_t start = 0;
for(int i=0;i< vLines.size();i++)
{
size_t v_size =vLines[i].vPointList.size() * sizeof(Point);
glBufferSubData(GL_ARRAY_BUFFER, start, v_size, &vLines[i].vPointList[0]);
start += v_size;
}
if(start == pt_count * sizeof(Point) )
{
fprintf( stdout, "INFO: %s\n", "Same count");
}
glVertexAttribPointer(0, 4, GL_DOUBLE, GL_FALSE, 4 * sizeof(GLdouble), (GLvoid*)0);
和绘图调用。我注意到第一行的最后一个点正在连接到该行的第一个点。
glDrawArrays(GL_LINE_STRIP, 0,pt_count);
【问题讨论】:
标签: opengl vector shader vbo polyline