我计算了很多顶点,然后用四边形条显示它们以用于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内不允许推送/弹出,并且您不得超过堆栈限制)。

    10-04 13:33