我在使用这些代码在屏幕上渲染多个圆圈时遇到问题。
float degree = 0;
unsigned int ctr = 0;
for(int xi = -3200; xi < 3200; xi+= 2*r)
{
for(int yi = 4800; yi > -4800; yi-= 2*r)
{
for(int i = 0; i < 360; ++i)
{
vertices.push_back(xi + r * cos(float(degree)));
vertices.push_back(yi + r * sin(float(degree)));
vertices.push_back(-8);
indices.push_back(i+ctr);
++degree;
}
ctr += 360;
degree = 0;
}
}
unsigned int i = 0;
for(i = 0; i < indices.size()/360; ++i)
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertices[i*360]);
glLineWidth(1);
glDrawElements(GL_LINE_LOOP, 360, GL_UNSIGNED_INT, &indices[i*360]);
glDisableClientState(GL_VERTEX_ARRAY);
}
结果如下
此外,当我将xi值更改为[-6400,6400]时程序崩溃
答案 0 :(得分:4)
不考虑这种技术的可疑性质,你可能会错误地访问索引。
glVertexPointer(3, GL_FLOAT, 0, &vertices[i*360]);
glDrawElements(GL_LINE_LOOP, 360, GL_UNSIGNED_INT, &indices[i*360]);
glDrawElements的索引指定glVertexPointer顶点的偏移量。您已将索引定义为相对于顶点缓冲区的起点:
indices.push_back(i+ctr);
但是你要为你绘制的每个圆圈移动缓冲区偏移量。因此,在您的索引缓冲区中,第二个圆从索引360开始。但是当您绘制第二个圆时,您还移动顶点指针,使得索引360是指针的第0个元素。
然后当您尝试访问索引360时,您实际上正在访问元素720(360 +缓冲区@ 360的启动)。