c++ - OpenGL VBO 索引(如何计算索引数组)
问题描述
我们正在将 OpenGL 迁移到更新的版本(ES 2.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();
}
}
解决方案
我从未使用过矢量图形,但这只是关于如何从某些顶点创建索引。因此,如果我正确阅读了您的代码,您的顶点将存储在finalVecToDraw
向量中。首先为索引创建一个向量,支持的类型unsigned char
最多为unsigned int
.
然后将该向量调整为顶点数组的大小(这将为您节省大量调整向量大小的时间)。
填充向量,使索引 n 处的元素具有值 n。因此,例如使用以下代码:
for(int i = 0; i < indices.size(); i++) {
indices[i] = i;
}
这将做你已经做的,但使用索引。
现在我们需要删除顶点向量中的重复条目并调整索引。我不知道哪种算法最适合为您的案例找到重复项,但您需要这样做。副本位于索引处d
,该值第一次出现在o
. d
必须大于o
:
- 删除 d 处的顶点。
- 遍历您的索引,如果一个元素的值大于 d,则从中减去一个。
- 将 d 处的索引值设置为 o。
推荐阅读
- r - 为什么数字没有映射到每一行?
- xamarin - Xamarin 形成 AppIcon.xcassets 导致上传错误。
- python - Keras ValueError:应在输入列表上调用合并层
- python - 如何通过多列的功能对 Pandas 行进行分组
- java - 消息:PrimeFaces 扩展 DocumentViewer 中缺少 PDF
- apache-spark - spark数据帧写入HDFS的文件名
- php - CI_session 未保存在 Mozilla Firefox 中
- android - 在没有 Android Studio 的情况下从 Android 源代码生成签名的 APK
- python-3.x - 在 Python 中枚举和打印行。
- c# - System.ObjectDisposedException:“无法写入已关闭的 TextWriter。” 设置输出错误