gpt4 book ai didi

c++ - glPushMatrix() 和 glBegin() 之间有联系吗?

转载 作者:太空狗 更新时间:2023-10-29 19:56:35 24 4
gpt4 key购买 nike

我正在计算很多顶点,然后用四边形 strip 显示它们以获得 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();
}

最佳答案

  1. 堆栈大小有限!!!

    因此 vec.size() 必须小于或等于您的 OpenGL 实现矩阵堆栈大小 - 在循环之前使用它的层。这让你的黑客攻击有点危险。

  2. 使用glGetError

    你应该在你使用的每一个主要的 gl 东西之后检查 glGetError(同时调试并应用它直到它没有返回错误)。也有像 glIntercept 这样的工具可以为你做这件事。它应该揭示问题的真正所在。

  3. 缺少 glEnd()

    当您使用旧的 api 时,请尝试在循环之前添加几次 glEnd();。如果这有助于您在某处丢失 glEnd();,这是新手常见的错误,因为 glEnd; 也是可编译的,但什么都不做。

    这可以在矩阵推送/弹出之后由 OpenGL 重置,但这纯粹是我的猜测。

  4. glBegin/glEnd 中调用 glMaterialfv

    OpenGL docs状态:

    The material parameters can be updated at any time. In particular, glMaterial can be called between a call to glBegin and the corresponding call to glEnd. If only a single material parameter is to be changed per vertex, however, glColorMaterial is preferred over glMaterial (see glColorMaterial).

    我会尽量避免在 glBegin/glEnd 中使用 glMaterial,因为我的经验是糟糕的 OpenGL 实现(如 Intel)不会遵循信函的规范,可能会在某些平台/情况下导致问题,如果现在不使用,那么将来...

所以回答你的问题: glBegin/glEnd 不应该受到 glPushMatrix/glPopMatrix 的影响,反之亦然,如果它们使用得当的话(在 glBegin/glEnd 中不允许 push/pop,并且你不能超过堆栈限制)。

关于c++ - glPushMatrix() 和 glBegin() 之间有联系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404893/

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