GL_TRIANGLES instead of GL_QUADS

GL_TRIANGLES instead of GL_QUADS

本文关键字:GL QUADS of TRIANGLES instead      更新时间:2023-10-16

我想修改生成三维球体的代码,所以它使用三角形而不是四边形进行绘制。和往常一样,问题是我遇到了一些错误——"向量迭代器不可增量"。它怎么了?

SolidSphere(float radius, unsigned int rings, unsigned int sectors)
{
    float const R = 1.0f / (float)(rings-1);
    float const S = 1.0f / (float)(sectors-1);
    int r, s;
    vertices.resize(rings * sectors * 3);
    normals.resize(rings * sectors * 3);
    texcoords.resize(rings * sectors * 2);
    std::vector<GLfloat>::iterator v = vertices.begin();
    std::vector<GLfloat>::iterator n = normals.begin();
    std::vector<GLfloat>::iterator t = texcoords.begin();
    for(r = 0; r < rings; r++) for(s = 0; s < sectors; s++) {
            float const x = sinf(M_PI * r * R) * cosf(2 * M_PI * s * S);
            float const y = sinf(-M_PI_2 + M_PI * r * R );                
            float const z = sinf(2.0f * M_PI * s * S) * sinf( M_PI * r * R );
            *t++ = s*S;
            *t++ = r*R;
            *v++ = x * radius;
            *v++ = y * radius;
            *v++ = z * radius;
            *n++ = x;
            *n++ = y;
            *n++ = z;
    }
    indices.resize(rings * sectors * 4);
    std::vector<GLushort>::iterator i = indices.begin();
    for(r = 0; r < rings-1; r++) for(s = 0; s < sectors-1; s++) {
        /* triangles -- not working!
        *i++ = r * sectors + s;
        *i++ = (r + 1) * sectors + (s + 1);
        *i++ = r * sectors + (s + 1);
        *i++ = r * sectors + s;
        *i++ = (r + 1) * sectors + s;
        *i++ = (r + 1) * sectors + (s + 1); */
        /* quads */
        *i++ = r * sectors + s;
        *i++ = r * sectors + (s+1);
        *i++ = (r+1) * sectors + (s+1);
        *i++ = (r+1) * sectors + s;
    }
}

看起来您的三角形生成器版本的循环执行(sectors-1)(rings-1)次迭代,每次都将i增加六次,但您已经将向量i迭代的大小调整为仅(rings * sectors * 4),这对于循环的四元生成器版本来说已经足够了。


假设三角形版本是可以的,这次调整将修复它:

indices.resize(rings * sectors * 6)

当您在没有喝足够咖啡的情况下进行编码时,通常会出现这种疏忽。或者太多了(显示代码实际失败时双曲线边界的图表,(将环和扇区数映射到x和y(,因为您分配的空间比迭代所需的空间多(