使用GL_LINE_LOOP绘制多个圆圈

时间:2012-07-16 17:27:09

标签: c++ opengl

我在使用这些代码在屏幕上渲染多个圆圈时遇到问题。

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);
}

结果如下 circles

此外,当我将xi值更改为[-6400,6400]时程序崩溃

1 个答案:

答案 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的启动)。