OpenGL VBO Indexing ( How to compute Index Array)
OpenGL VBO Indexing ( How to compute Index Array)
我们正在将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。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- OpenGL VBO Indexing ( How to compute Index Array)
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何根据排序索引的向量对 std::index 集进行排序?
- 在一行代码中理解 index++
- 为什么打印 c 样式字符串的'address of index n'会导致子字符串的输出
- 使用 std::get 访问 std::variant<index>
- 代码中的"vector<<int>vector>&index"是什么意思?
- Generate boost::uuids::uuid from boost::compute::detail::sha
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 如何配置 Doxygen 以在"Class Index"中包含类的类型定义?
- OpenGL Framebuffer ColorAttachment to Compute Shader
- 在 OpenCV 中使用 hog.compute(..) 进行访问冲突
- QList::operator[]中的断言失败<T>:QJoysticks 中的"index out of range"
- Array.at(index) over Array[index]
- 在 Lua 中加载 C++ 模块时'Attempt to index a string value'错误
- 在 boost::compute 中分配大向量
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数