gpt4 book ai didi

c++ - OpenGL glDrawElements

转载 作者:行者123 更新时间:2023-11-28 05:27:42 25 4
gpt4 key购买 nike

给定一组面,每个面包含顶点数和指向 vector std::Vector 中的顶点的指针,我想遍历所有面并使用 glDrawElements 绘制每个面:

编辑:我刚刚注意到我忘了激活 vertex_array

for(std::vector<Face>::iterator it = faces.begin();it != faces.end();++it) {
const Face &f = *it;

std::Vector<GLint> indices;
std::Vector<GLfloat> positions;

for(int i=0;i<f.vcount;++i){
const Vertex &v = vertices[f.vertices[i]];

positions.push_back(v.x);
positions.push_back(v.y);
positions.push_back(v.z);

indices.push_back(f.vertices[i]);
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,3*sizeof(GL_FLOAT),&positions[0]);

glDrawElements(GL_POLYGON,indices.size(),GL_UNSIGNED_INT,&indices[0]);
glDisableClientState(GL_VERTEX_ARRAY);
positions.clear();
indices.clear();
}

但显然这不能正常工作并且没有任何显示。

编辑:启用 GL_VERTEX_ARRAY 会在屏幕上绘制一些内容,但不会绘制我尝试创建的模型。所以寻址似乎有问题。

最佳答案

您的索引数组没有意义。索引 glDrawElements 将仅引用您设置的顶点数组 - 您正在为每个单独的多边形设置一个新数组。

这意味着

indices.push_back(f.vertices[i]);

概念上应该只是

indices.push_back(i);

这最终意味着您可以完全跳过索引并直接使用

glDrawArrays(GL_POLYGON,0,f.vcount);

请注意,您在这里所做的是一种非常低效的渲染对象的方式。如果您对整个对象使用单个绘制调用,您会好得多。您可以通过将多边形手动三角化为三角形作为预处理步骤来做到这一点。

关于c++ - OpenGL glDrawElements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204970/

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