Проблемы с буфером глубины и буфером шаблонов QML

Я использую QML и хочу запустить собственный код OpenGL. Я создал собственный виджет в С++ (расширяя QQuickItem) и переопределив функцию paint().
Когда я запускаю приложение, консоль печатает

QSGContext::initialize: depth buffer support missing, expect rendering errors
QSGContext::initialize: stencil buffer support missing, expect rendering errors

И так же, как и было предсказано, я получаю ошибки рендеринга. В качестве примера я использую модель паука. Вот что ему должно понравиться

spider stl

И вот что я получаю введите описание изображения здесь

Я также не знаю точно, как это описать, но в основном противоположная сторона (которая должна быть заблокирована передним лицом) показывается, когда я поворачиваю ее.

Мне удалось избавиться от ошибки буфера глубины следующим образом:

void MyGLWidget::handleWindowChanged(QQuickWindow *win)
{
    if (win) {
        connect(win, SIGNAL(beforeSynchronizing()), this, SLOT(sync()), Qt::DirectConnection);
        connect(win, SIGNAL(sceneGraphInvalidated()), this, SLOT(cleanup()), Qt::DirectConnection);
        win->setClearBeforeRendering(false);
        QSurfaceFormat glFormat;
        glFormat.setVersion(3,2);
        glFormat.setProfile(QSurfaceFormat::CoreProfile);




        /*I'm showing everything for context, but this is the key line*/
        glFormat.setDepthBufferSize(1); 






        win->setFormat(glFormat);

    }
}

Итак, теперь я получаю только трафаретную ошибку, но это вызывает другую проблему. Одна сторона полностью черная и не показывает никакого освещения.

введите описание изображения здесь

Некоторые другие справочные данные: я показываю QQuickView. Мой OpenGLWidget импортируется в QML и встроен так:

MyGLWidget {
    id: glWidget
}

В paint() моего средства визуализации я вызываю glEnable(GL_DEPTH_TEST) и glEnable(GL_STENCIL_TEST) вверху, но это, похоже, ничего не делает. Может, я позвоню в неправильном контексте? Я не знаю, где еще я мог бы это назвать.

Ответы

Ответ 1

Как оказалось, все мои модели (включая паука) имели неправильные вершинные нормали, а значит, и тени. Я должен был проверить их в другом программном обеспечении для рендеринга.

glFormat.setDepthBufferSize(1) было истинным исправлением