Странные дыры, тени и повороты в обновлении появляются в openGL - PullRequest
0 голосов
/ 10 октября 2019

У меня есть код, который отлично работает в 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.

1 Ответ

0 голосов
/ 11 ноября 2019

Проблема заключалась в том, что у старых компьютеров, которые я тестировал, были драйверы Nvidia, а новые компьютеры имели встроенный графический процессор Intel, что означает, что они используют драйверы 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 или где-либо еще.

Спасибо всем за ваши комментарии.

...