提问者:小点点

OpenGL VBO索引(如何计算索引数组)


我们正在将OpenGL迁移到较新的版本(ES2.0)。 应用程序实际上呈现矢量图像(即CGM文件)。 我已经成功地渲染了图形使用顶点使用VBO。 但问题是性能。 DisplayList的性能要比VBO好得多。 所以我在考虑使用VBO索引。 如何生成索引数组? 索引会提高性能吗? 请在下面找到我的代码

//This is my data structure

struct DisplayIndexID {
        int idx;
        DrawStateT drawState;

        //Every display Index ID has its own draw models.
        std::vector<std::unique_ptr<vertexModel>> readytoDrawModels;
    };

//Initializing the VBO 
void initVbo(std::vector<DisplayIndexID> & v)

{
    glBindVertexArray(geomVAO);
    glBindBuffer(GL_ARRAY_BUFFER, geomVBO);
    std::vector<QVector3D> vecToDraw;
    std::vector<QVector3D> finalVecToDraw;
    for (int j = 0; j < v.size(); j++)
        for (auto& vModel : v[j].readytoDrawModels)
        {
            if (vModel) {
                vecToDraw = vModel->getVertices();
                finalVecToDraw.insert(finalVecToDraw.end(), vecToDraw.begin(), vecToDraw.end());
    
            }
        }
    
    glBufferData(GL_ARRAY_BUFFER, sizeof(QVector3D) * finalVecToDraw.size(), &finalVecToDraw[0],GL_STATIC_DRAW );
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//Rendering function 
void drawDisplayLists(std::vector<DisplayIndexID> & v)
{
    GLintptr offset = 0;
    
    initVbo(v);
    
    for (int i = 0; i < v.size(); i++)
    {

        //***********PRINT AREA***********************/
        for (auto& vModel : v[i].readytoDrawModels)
        {
           glBindBuffer(GL_ARRAY_BUFFER, geomVBO);
           glEnableVertexAttribArray(0);
           glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(QVector3D), (GLvoid*)offset); 
           switch (vModel->getDrawMode())
            {
                case 0: //GL_POINTS
                    glDrawArrays(GL_POINTS, 0, vModel->getVertices().size());
                    break;

                case 1: //GL_LINES
                    glDrawArrays(GL_LINES, 0, vModel->getVertices().size());
                    break;
                case 3: // GL_TRIANGLE
                     ...
        }
                  offset += sizeof(QVector3D) * vModel->getVertices().size();
    }  



}


共1个答案

匿名用户

我从来没有与矢量图形,但这只是关于如何创建索引从一些顶点。 因此,如果我正确阅读了您的代码,您的顶点存储在FinalVectOdraw向量中。 首先为索引创建一个矢量,支持的类型是unsigned charunsigned int

然后将该向量的大小调整为顶点数组的大小(这将节省您调整向量大小的大量时间)。

填充向量,使索引n处的元素具有值n。 例如,下面的代码:

for(int i = 0; i < indices.size(); i++) {
    indices[i] = i;
}

这将做你已经做的事情,但是使用索引。

现在我们需要移除顶点向量中的重复条目并调整索引。 我不知道什么算法会是最好的找到副本为您的案例,但您需要这样做。 重复项位于索引d处,该值第一次出现在o处。 d必须大于o:

  1. 删除%d处的顶点。
  2. 对索引进行迭代,如果元素的值大于d,则从该元素中减去1.
  3. 将索引的值设置为d到o.