Ответ 1
Как оказалось, все мои модели (включая паука) имели неправильные вершинные нормали, а значит, и тени. Я должен был проверить их в другом программном обеспечении для рендеринга.
glFormat.setDepthBufferSize(1)
было истинным исправлением
Я использую QML и хочу запустить собственный код OpenGL. Я создал собственный виджет в С++ (расширяя QQuickItem) и переопределив функцию paint().
Когда я запускаю приложение, консоль печатает
QSGContext::initialize: depth buffer support missing, expect rendering errors
QSGContext::initialize: stencil buffer support missing, expect rendering errors
И так же, как и было предсказано, я получаю ошибки рендеринга. В качестве примера я использую модель паука. Вот что ему должно понравиться
Я также не знаю точно, как это описать, но в основном противоположная сторона (которая должна быть заблокирована передним лицом) показывается, когда я поворачиваю ее.
Мне удалось избавиться от ошибки буфера глубины следующим образом:
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)
вверху, но это, похоже, ничего не делает. Может, я позвоню в неправильном контексте? Я не знаю, где еще я мог бы это назвать.
Как оказалось, все мои модели (включая паука) имели неправильные вершинные нормали, а значит, и тени. Я должен был проверить их в другом программном обеспечении для рендеринга.
glFormat.setDepthBufferSize(1)
было истинным исправлением
Try
glDepthMask(GL_TRUE);
// your paintings here
glDepthMask(GL_FALSE);
См. также График сцены и рендеринг.