2015-10-31 7 views
15

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

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

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

spider stl

И вот что я получаю enter image description here

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

Я сумел избавиться от ошибки буфера глубины с этим:

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); 

    } 
} 

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

enter image description here

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

MyGLWidget { 
    id: glWidget 
} 

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

ответ

3

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

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

1

Попробуйте

glDepthMask(GL_TRUE); 
// your paintings here 
glDepthMask(GL_FALSE); 

Смотрите также Scene Graph and Rendering.

+0

ничего не менял. Я посмотрю ссылку и посмотрю, смогу ли я получить решение – faraza

Смежные вопросы