【发布时间】:2019-10-10 15:00:09
【问题描述】:
我有一个在 Ubuntu14 和 OpenGL 2.12 中完美运行的代码(在 glxinfo 的输出中没有“核心”),一切看起来都很好,如图 1 所示。旋转、阴影和一切看起来都很好。
然后我在 3 台机器上编译并运行,但使用的是 Ubuntu18 OpenGL 4.5(核心),看起来有洞,奇怪的阴影和旋转是错误的,如图 2 所示:
我已将球体的线移到底部,并且似乎纠正了进入球体的圆柱体,但这并没有解决问题,而是根据旋转显示的 3D 几何图形按照你放置的顺序显示对象,因此您放入场景中的最后一个对象始终位于顶部。我不知道为什么要这样做,因为在旧机器上相同的代码看起来没问题。
这些是在 Ubuntu14 中可以正常工作的初始参数...
glViewport(subWinWidth * (subWinIndex % colCount), subWinHeight * (rowCount - 1 - subWinIndex / colCount), (GLint)subWinWidth, (GLint)subWinHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
...
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
glEnable(GL_DEPTH_TEST); // Enable Depth Buffer
glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glClearColor(0.6f, 0.6f, 0.8f, 1.0f);
//Used to display semi-transparent
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
//glClear(GL_ALWAYS);
GLfloat ligDif[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat ligSpe[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat ligPos[] = { -0.8f, 0.7f, 1.0f, 0.0f};
GLfloat ligAmb[] = {0.2f, 0.2f, 0.2f, 1.0f};
GLfloat matAmb[] = {0.3f, 0.3f, 0.3f, 1.0f};
GLfloat matDif[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat matSpe[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat matEmi[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat matShi[] = {100.0f};
glLightfv(GL_LIGHT0, GL_AMBIENT, ligAmb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, ligDif);
glLightfv(GL_LIGHT0, GL_SPECULAR, ligSpe);
glLightfv(GL_LIGHT0, GL_POSITION, ligPos);
glMaterialfv(GL_FRONT, GL_AMBIENT, matAmb);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matDif);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSpe);
glMaterialfv(GL_FRONT, GL_EMISSION, matEmi);
glMaterialfv(GL_FRONT, GL_SHININESS, matShi);
...
glPushMatrix();
glTranslatef(atom->pos.x, atom->pos.y, atom->pos.z);
...
sphere = gluNewQuadric();
gluSphere(sphere, dispRadius, Slices, Stacks);
...
gluCylinder(pObjQuadric, radius, radius, distance, slices, stacks);
gluDeleteQuadric(pObjQuadric);
...
至少我在图形部分没有任何错误信息。我收到警告消息,但使用 wxWidget lib。
【问题讨论】:
-
您正在使用 OpenGL 即时模式和 OpenGL 3.0,这是不受支持的。您的应用程序很可能正在使用兼容性配置文件,该配置文件在其立即模式实现中可能存在一些缺陷。如果可能的话,要么强制它要求 2.0 配置文件,要么更新你的代码以使用现代 OpenGL。
-
glDepthFunc(GL_NEVER) 表示没有片段通过深度测试。我很惊讶你在屏幕上画了任何东西。如果您需要帮助,您应该首先将您的代码减少到 minimal reproducible example,因为您未共享的代码可能是答案的一部分。
-
圆柱上的奇怪条纹可能是因为您使用了
slices(与上面几行的Slices不同)。但我们永远不会知道... -
感谢大家的cmets。 Sergio Monteleone 我的 OpneGL 版本错误,实际版本是 4.5。
-
Botje 我弄错了 glDepthFunc(GL_NEVER),实际是 glDepthFunc(GL_LEQUAL)。我想我都试过了。切片和堆栈在不同的 void 中定义并以这种方式获取值: slices = GetUIProps()->openGLProps.movingObjectSlices; stacks = GetUIProps()->openGLProps.movingObjectStacks;
标签: c++ opengl wxwidgets ubuntu-18.04