gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:13:33 25 4
gpt4 key购买 nike

我们正在将OpenGL迁移到较新版本(ES 2.0)。应用程序实际上会渲染 vector 图像(即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();
}



}

最佳答案

我从未使用过 vector 图形,但这只是如何从某些顶点创建索引。因此,如果我正确阅读了您的代码,则您的顶点将存储在finalVecToDraw vector 中。首先为索引创建一个 vector ,支持的类型是unsigned charunsigned int
然后将 vector 调整为顶点数组的大小(这将节省您调整 vector 大小的大量时间)。
填充 vector ,以使索引n处的元素具有值n。所以
例如,使用以下代码:

for(int i = 0; i < indices.size(); i++) {
indices[i] = i;
}
这将完成您已经做的事情,但要使用索引。
现在我们需要删除顶点 vector 中的重复项并调整索引。我不知道哪种算法最适合您的案例,但是您需要这样做。
重复项在索引 d处,并且此值第一次显示在 o处。 d必须大于 o:
  • 删除d处的顶点。
  • 遍历索引,如果元素的值大于d,则从中减去一个。
  • 将d处的索引值设置为o。
  • 关于c++ - OpenGL VBO索引(如何计算索引数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62677565/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com