У меня есть код, который отлично работает в Ubuntu14 и OpenGL 2.12 (без «ядра» в выводе glxinfo), все выглядит хорошо, как на рис. 1. Повороты, тени и все выглядит хорошо.
Затем я скомпилировал и запустил на 3-х машинах, но с Ubuntu18 OpenGL 4.5 (ядро) и смотрел дыры, странные тени и повороты были неправильнымикак на рисунке 2:
Я переместил линию сфер на дно и, похоже, исправляет цилиндры, входящие в сферу, но это делаетне решить проблему, вместо того, чтобы показывать вам трехмерные геометрические фигуры в соответствии с поворотами, показывает последовательность того, как вы помещаете объекты, поэтому последний объект, который вы помещаете в сцену, всегда находится сверху. Я понятия не имею, почему делает это, потому что на старых машинах тот же код выглядит нормально.
Это исходные параметры, которые отлично работают в 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.