在glVertexPointer OpenGL函数中使用C ++ std :: Vector

时间:2012-07-05 06:01:11

标签: c++ opengl

我有一个浮点矢量,这个矢量描述了一组三角形,每个三角形用18个浮点数描述,前3个是第一个顶点,接下来3个描述最后一个顶点的法线,依此类推3次直到描述每个三角形。

我正在使用

std::vector< GLfloat >

存储所有数字,这是我渲染三角形的代码

void Visualizer::draw3dModel()
{
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data() + 3);
    glVertexPointer(3, GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data());

    glPushMatrix();

        glScalef(0.05f, 0.05f, 0.05f);
        glColor3f(1,1,1);

        glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size());

    glPopMatrix();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
}

这段代码实际上有效,但在某些时刻我会用新的三角形重建浮点数的向量,它可以是或多或少的三角形

在创建新三角形之前,我使用此函数

清除顶点向量
std::vector< GLfloat >* MarchingCubesThread::getTriangles(float minvalue_scale)
{
    this->generateTriangles(minvalue_scale);

    for(unsigned int i=0; i < this->num_triangles; i++)
    {
        for(int j=0; j < 3; j++)
        {   
            this->vertexes.push_back(this->triangles[i].p[j].x);
            this->vertexes.push_back(this->triangles[i].p[j].y);
            this->vertexes.push_back(this->triangles[i].p[j].z);

            this->vertexes.push_back(this->triangles[i].norm.x);
            this->vertexes.push_back(this->triangles[i].norm.y);
            this->vertexes.push_back(this->triangles[i].norm.z);
        }
    }

    return &(this->vertexes);
}

void MarchingCubesThread::generateTriangles(float minvalue_scale)
{
    this->vertexes.clear();
    this->triangles.clear();

    this->triangles = MarchingCubesDataset(this->dataset->getMaxVal() * minvalue_scale, *(this->dataset), LinearInterp, this->num_triangles);   
}

在创建一组新的三角形之后,OpenGL渲染会很好地更新网格,但在某些时刻,我会得到一些垃圾三角形和/或来自上一次迭代的三角形,它们应该通过调用来清除这样:

this->vertexes.clear();
this->triangles.clear();

这里连续拍摄了一些截图:

original surface after creating new triangles, shows some triangles from past surface the same effect here

有关此处发生的事情的任何线索?,谢谢

PD:对于完整的源代码,这是github上的公共git存储库: https://github.com/joecabezas/MemoriaJoeCabezasCode/tree/visualizer

1 个答案:

答案 0 :(得分:4)

glDrawArrays期望缓冲区中的浮点数不计,但顶点计数。 所以正确的电话应该是:

glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size() / 6);

glDrawArrays绘制6倍以上的顶点,在有效矢量数据结束后显示垃圾,有时它是前一次迭代的数据。