【发布时间】:2016-10-23 16:12:00
【问题描述】:
给定一组面,每个面包含顶点数和指向向量 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 会在屏幕上绘制一些东西,但不是我试图创建的模型。所以地址似乎有问题。
【问题讨论】:
-
glVertexPointer应该有GL_FLOAT而不是GL_INT作为第二个参数,3 * sizeof(GLfloat)作为第三个参数。 -
另外,
GL_POLYGON不再是有效的绘图模式。从文档中:“符号常量 GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、GL_LINES、GL_LINE_STRIP_ADJACENCY、GL_LINES_ADJACENCY、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_TRIANGLES、GL_TRIANGLE_STRIP_ADJACENCY、GL_TRIANGLES_ADJACENCY 和 GL_PATCH 被接受。” -
@poetryofruins:“此外,GL_POLYGON 不再是有效的绘图模式”因此,
glVertexPointer在核心配置文件 OpenGL 中也不再可用。所以如果他能用一个,他就可以清楚地使用另一个。 -
我进行了建议的更改,但仍然没有任何内容。
-
你确定你的索引是正确的吗?如果它们不是从源数据中按顺序排列的,则顶点的位置与索引指向的位置完全不同。此外,如果(极有可能)在源数据中多次引用顶点,您可能会复制顶点数据。