0

これらのコードを使用して、画面上に多くの円をレンダリングする際に問題があります。

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] に変更すると、プログラムがクラッシュします。

4

1 に答える 1

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

ただし、描画する円ごとにバッファー オフセットを移動しています。したがって、インデックス バッファーでは、2 番目の円はインデックス 360 から始まります。ただし、2 番目の円を描画するときは、インデックス 360 がポインターの 0 番目の要素になるように頂点ポインターも移動します。

次に、インデックス 360 にアクセスしようとすると、実際には要素 720 (360 + バッファー @360 の開始) にアクセスしています。

于 2012-07-16T18:00:38.333 に答える