Russian Qt Forum

Qt => OpenGL => Тема начата: spirits25 от Апрель 30, 2013, 10:19



Название: [РЕШЕНО] Как не прятать QGLSceneNode?
Отправлено: spirits25 от Апрель 30, 2013, 10:19
Всем привет. В графике я совсем не силён, но вот припёрло.
Проблема у меня такая - QGLSceneNode, находящийся за (под, в) другими объектами QGLSceneNode необходимо показывать всегда, независимо от того, спрятан он за другими или нет.
Подскажите как это правильно сделать? Не glDisable(GL_DEPTH_TEST) ведь?=)


Название: Re: Как не прятать QGLSceneNode?
Отправлено: Igors от Апрель 30, 2013, 10:37
Я использовал glDepthFunc(GL_ALWAYS)


Название: Re: Как не прятать QGLSceneNode?
Отправлено: spirits25 от Апрель 30, 2013, 10:39
Я использовал glDepthFunc(GL_ALWAYS)

Спасибо, попробую.
То есть всё же используются функции gl* ?


Название: Re: Как не прятать QGLSceneNode?
Отправлено: spirits25 от Апрель 30, 2013, 11:27
При использовании
Код:
glDepthFunc(GL_ALWAYS);
Всё глючит (картинку прикрепляю).

При
Код:
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glDepthFunc(GL_ALWAYS);
Верхний слой не отображается там, где есть нижний (становится 100% прозрачным).

Я думаю мне нужен второй вариант, но при этом указать верхнему слою, чтобы он тоже не исчезал?


Название: Re: Как не прятать QGLSceneNode?
Отправлено: spirits25 от Май 06, 2013, 14:42
если я использую так
Код:
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK_NORMALS_HINT_PGI);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
То для начальной позиции всё хорошо (не считая что верхний 2D слой пропадает). Но при перерисовке нижнего фона он становится одним видимым (передний становится прозрачным).
Может ещё варианты есть? я знаю, что делаю не правильно, но не знаю что именно=)
Спасибо.


Название: Re: Как не прятать QGLSceneNode?
Отправлено: Igors от Май 07, 2013, 13:53
Порылся в старом коде, нашел это место

Код
C++ (Qt)
void MyClass::DepthDither( void )
{
static GLubyte halfTone[] = {
 
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
};
 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_ALWAYS);
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(halfTone);
 
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, static_cast<float>(mVPW), static_cast<float>(mVPH), 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
 
glBegin(GL_QUADS);
this->SetVertex(0.0, 0.0, -1.0);
this->SetVertex(mVPW, 0.0, -1.0);
this->SetVertex(mVPW, mVPH, -1.0);
this->SetVertex(0.0, mVPH, -1.0);
glEnd();
 
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
 
glDisable(GL_POLYGON_STIPPLE);
glDepthFunc(GL_LESS);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
} // DepthDither
 
mVPW(H) - размеры окна в пыкселях.


Название: Re: Как не прятать QGLSceneNode?
Отправлено: spirits25 от Май 07, 2013, 15:41
Добавил до добавления элементов
Код:
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_ALWAYS);
glEnable(GL_POLYGON_STIPPLE);
и после
Код:
    glDisable(GL_POLYGON_STIPPLE);
    glDepthFunc(GL_LESS);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
Но всё равно, при изменении задних объектов (при удалении старых и взамен добавлении новых) они не отображаются (наверно, программа всё же остаётся при мнении, что они скрыты и не должны быть отображены).

Спасибо за помощь, буду пытаться ещё.


Название: Re: Как не прятать QGLSceneNode?
Отправлено: Igors от Май 07, 2013, 16:45
Но всё равно, при изменении задних объектов (при удалении старых и взамен добавлении новых) они не отображаются (наверно, программа всё же остаётся при мнении, что они скрыты и не должны быть отображены).
Про удаление/добавление ничего не знаю - приведенный метод только обеспечивает рисование объектов перекрытых другими/ближайшими


Название: Re: Как не прятать QGLSceneNode?
Отправлено: spirits25 от Май 08, 2013, 11:58
Про удаление/добавление ничего не знаю - приведенный метод только обеспечивает рисование объектов перекрытых другими/ближайшими

В общем это как всегда я тупил=) Решение элементарное, может кому-нибудь пригодится.

Надо было просто создать разные и независимые!!! QGLSceneNode (это скрытый и передний объекты), которые отрисовываю в QGLView::paintGL отдельно в нужной последовательности, например:
Код:
void MyGLView::paintGL(QGLPainter *painter)
{
    glEnable(GL_BLEND);
    insideObject->draw(painter);
    faceObject->draw(painter);
    navigatePanel->draw(painter);
...

Вот так они рисуются независимо. Прошу прощение за продолжительное мозгоделание и ещё раз спасибо за советы=)