c++ - 更新中的奇怪孔、阴影和旋转出现在 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。
解决方案
问题是我测试过的旧电脑有 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 或任何地方。
感谢大家的意见。
推荐阅读
- html - Ionic 3(单击)事件进入模态在 ios 中不起作用
- java - 替换String java中的元素
- pandas - 当值取决于先前值时如何在 Pandas 中进行矢量化
- firemonkey - 加载 OpenSSL 动态库 arm & x86 (FMX, C++)
- ffmpeg - 使用 FFmpeg C/C++ 在 MKV 视频中缓慢搜索
- html - 页脚仅在一页上向上滑动。(此页面包含sql数据,页脚似乎忽略了它)
- angular - 将值从输入元素发送到结构指令?
- php - Behat Firefox 崩溃报告
- python - 内存错误:Jupyter Notebook 限制为 32 位
- python - 如何使用新行将数组的输出更改为列形