OpenGL - 将向量传递给glDrawElements()

TAT*_*ATN 0 opengl vector

我正在尝试将一个向量传递给glDrawElements()的最后一个参数.如果我使用数组,它工作正常.但是,当我切换到矢量时,它只渲染了一部分对象.

这工作得很好:

//TA_CartesianSys.h
class TA_CartesianSys
{
    private:
        int drawOrder[86];
    //the rest of the class
}


//---------------------------------
//TA_CartesianSys.cpp
TA_CartesianSys::TA_CartesianSys()
{
    GLfloat CartesianVertices[] = { ... };
    int tempOrder[] = { ... };
    for(int i = 0; i < sizeof(tempOrder) / sizeof(int); i++)
    {
         drawOrder[i] = tempOrder[i];
    }
    //Code to generate and bind vertex array and buffer
    glDrawElements(GL_LINES, sizeof(drawOrder)/sizeof(int), GL_UNSIGNED_INT, drawOrder);
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作,这就是它的样子:

在此输入图像描述

现在,我决定使用vector而不是array来进行drawOrder [].这是新代码:

//TA_CartesianSys.h
class TA_CartesianSys
{
    private:
    std::vector<int> drawOrder; //***NOTE: This is the change   
    //the rest of the class
}
//---------------------------------
//TA_CartesianSys.cpp
TA_CartesianSys::TA_CartesianSys()
{
    GLfloat CartesianVertices[] = { ... };
    int tempOrder[] = { ... };

    drawOrder.resize(sizeof(tempOrder) / sizeof(int));
    for(int i = 0; i < (sizeof(tempOrder) / sizeof(int)); i++)
    {
        drawOrder[i] = tempOrder[i];
    }

    //Code to generate and bind vertex array and buffer - Same as above

    glDrawElements(GL_LINES, sizeof(drawOrder)/sizeof(int), GL_UNSIGNED_INT, &drawOrder[0]);
}
Run Code Online (Sandbox Code Playgroud)

这就是我运行程序时得到的结果:

在此输入图像描述

注意:中间的正方形不是此对象的一部分.它属于一个完全不同的阶级.

所以,基本上,当我将drawOrder []更改为vector而不是array时,只渲染了我对象的一小部分(2行).其余的都没见过.

我在draw()函数中放置了一个断点,它表明drawOrder向量已正确初始化,其值与数组计数器部分完全相同.

在此输入图像描述

那么,为什么我只获得2行而不是整个网格呢?我错过了什么?

dat*_*olf 6

sizeof在矢量对象上只是告诉你矢量类实例的大小,而不是元素的数量.你想要的是std :: vector的size成员函数,它告诉你元素的数量(即你不能将std :: vector :: size返回的数字除以元素sizeof).

glDrawElements(
    GL_LINES,
    drawOrder.size(), // <<<<<
    GL_UNSIGNED_INT,
    &drawOrder[0] );
Run Code Online (Sandbox Code Playgroud)