首页 > 解决方案 > 更新中的奇怪孔、阴影和旋转出现在 openGL 中

问题描述

我有一个在 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。

标签: c++openglwxwidgetsubuntu-18.04

解决方案


问题是我测试过的旧电脑有 Nvidia 驱动程序,而新电脑集成了英特尔 GPU,这意味着那些使用 Mesa 驱动程序。问题是当您启用 glEnable(GL_DEPTH_TEST); Nvidia 驱动程序默认设置 GL_DEPTH_BITS = 24,而 Mesa 驱动程序设置 GL_DEPTH_BITS = 0。这使得 glDepthFunc(); 无用并根据顺序绘制对象以将它们放入场景中,而不管 z 坐标(到相机或视图的距离)会带来 z 冲突问题(阴影)等。因此,解决方案是当您创建例如,带有 GLUT 的窗口,使用以下命令:

glutInitDisplayMode(GLUT_DEPTH);

或者如果您使用的是 wxWidgets:

https://docs.wxwidgets.org/trunk/classwx_g_l_canvas.html#a56d0a2a022c0c34b7efa1114da151177

使用属性 WX_GL_DEPTH_SIZE = 24 或任何地方。

感谢大家的意见。


推荐阅读