我计算了很多顶点,然后用四边形条显示它们以用于3D表面图。
我对某些顶点有奇怪的行为,以无法预测的方式改变了颜色。我尝试修复它,并且碰巧的是,当我在前后放置glPushMatrix()
和glPopMatrix
时,发现问题已解决。有谁知道潜在的问题是什么?我通常应该在glBegin
/glEnd
周围使用push/pop吗?
这是我的工作代码:
for (int i = 1; i < vec.size(); i++) {
glPushMatrix();
glBegin(GL_QUAD_STRIP);
for (int j = 0; j < vec[i].size(); j++) {
glNormal3dv(vertex_normal[i][j]);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, reflectance[i][j]);
glVertex3d(vec[i][j].x(), vec[i][j].y(),vec[i][j].z());
glNormal3dv(vertex_normal[i-1][j]);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, reflectance[i-1][j]);
glVertex3d(vec[i-1][j].x(), vec[i-1][j].y(), vec[i-1][j].z());
}
glEnd();
glPopMatrix();
}
最佳答案
因此
vec.size()
必须小于或等于 OpenGL 实现矩阵堆栈大小-循环之前使用的层数。这使您的黑客行为有些危险。 glGetError
您应该在使用每个主要的
glGetError
内容之后检查gl
(在调试时,也应应用它,直到它没有返回错误为止)。还有诸如glIntercept之类的工具可以为您完成此任务。它应该揭示问题的真正出处。 glEnd()
当您使用旧的api时,请尝试在循环之前添加几次
glEnd();
。如果这样可以帮助您在某处丢失glEnd();
,这是菜鸟经常遇到的错误,因为glEnd;
也可以编译,但无济于事。在矩阵推送/弹出之后,可以由 OpenGL 重置该值,但这纯粹是我的猜测。
glMaterialfv
内调用glBegin/glEnd
OpenGL docs指出:
我会尝试避免在
glMaterial
中使用glBegin/glEnd
,因为我的经验是,糟糕的 OpenGL 实现(例如Intel)不遵循规范,并且可能会在某些平台/情况下出现问题且使用的用法不常见(如果现在不是现在) future ... 因此,回答您的问题:如果正确使用
glBegin/glEnd
,反之亦然,glPushMatrix/glPopMatrix
不应受到glBegin/glEnd
的影响(反之亦然)(ojit_code内不允许推送/弹出,并且您不得超过堆栈限制)。