- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在计算很多顶点,然后用四边形 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();
}
最佳答案
堆栈大小有限!!!
因此 vec.size()
必须小于或等于您的 OpenGL 实现矩阵堆栈大小 - 在循环之前使用它的层。这让你的黑客攻击有点危险。
使用glGetError
你应该在你使用的每一个主要的 gl
东西之后检查 glGetError
(同时调试并应用它直到它没有返回错误)。也有像 glIntercept 这样的工具可以为你做这件事。它应该揭示问题的真正所在。
缺少 glEnd()
当您使用旧的 api 时,请尝试在循环之前添加几次 glEnd();
。如果这有助于您在某处丢失 glEnd();
,这是新手常见的错误,因为 glEnd;
也是可编译的,但什么都不做。
这可以在矩阵推送/弹出之后由 OpenGL 重置,但这纯粹是我的猜测。
在 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/
我在旋转方面遇到了麻烦。我可以让立方体旋转得很好,但我只希望那个立方体旋转。我知道我必须使用 glPushMatrix() 和 glPopMatrix() 但每次我将这两个包裹在我的绘图周围时,它就会
我是 OpenGL 新手,我要做这样的东西。问题是,循环似乎只调用一次,但我不知道为什么它变得像 that . glDisable(GL_CULL_FACE); int n = 32; float a
我尝试对两个独立移动的对象进行编码,这意味着它们都在两个不同的方向上移动它有效但不能连续移动。当我将 glTranslatef() 放在 glPushMatrix() 之外时 ... glPopMat
我有以下代码: void drawObj1(){ glPushMatrix(); glTranslatef(rBaseInitPos + (rBaseDim[0]
我知道在 opengl 中使用 gluLookAt(...) 、glPushMatrix 和其他基本转换工具的目的是什么。我被困在这些代码中。在为 opengl 设置适当的要求后,当我在 glPush
我尝试设计一个场景,其中有 3 个球体和一条水平线作为赤道。我必须画出 3 个球体,但我不知道为什么线没有画出来。 这是我的代码,如果你能看出我哪里错了: #include #include vo
我在网上找到了一些代码,可以在屏幕上移动一个框,然后在框到达屏幕末端后重置它。 这是代码: void display(void) { int sign = 1; if (lastFrameTi
我正在计算很多顶点,然后用四边形 strip 显示它们以获得 3D 曲面图。 我对某些顶点有一种奇怪的行为,以不可预测的方式改变颜色。我尝试修复它,巧合的是,当我在前后放置 glPushMatrix(
当对对象应用转换时,我们使用 glPushMatrix/glPopMatrix。但是为什么我们不只使用 glLoadIdentity 呢? 因此 glPushMatrix() ..ap
我有使用旧 OpenGL ES 1 的 Android 项目。我正在使用这种嵌套调用: ... gl.glPushMatrix(); ... gl.glPushMatrix(); ... gl.glP
我尝试从传入的 iphone 麦克风流中绘制波形。数据的提取没有问题,绘图工作正常。只有当我使用 OpenGL 异常断点时,xcode 才会在 glPushMatrix() & glPopMatrix
我正在清除一些曾经运行但不再运行的 wxPython/PyOpenGL 代码——显然它在一个或另一个模块的一些更新后停止工作,我不知道什么时候。 这是一个重现错误的小型示例应用。 import wx
我是一名优秀的程序员,十分优秀!