Russian Qt Forum
Май 03, 2024, 21:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Как не прятать QGLSceneNode?  (Прочитано 5562 раз)
spirits25
Гость
« : Апрель 30, 2013, 10:19 »

Всем привет. В графике я совсем не силён, но вот припёрло.
Проблема у меня такая - QGLSceneNode, находящийся за (под, в) другими объектами QGLSceneNode необходимо показывать всегда, независимо от того, спрятан он за другими или нет.
Подскажите как это правильно сделать? Не glDisable(GL_DEPTH_TEST) ведь?=)
« Последнее редактирование: Май 08, 2013, 11:59 от spirits25 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 30, 2013, 10:37 »

Я использовал glDepthFunc(GL_ALWAYS)
Записан
spirits25
Гость
« Ответ #2 : Апрель 30, 2013, 10:39 »

Я использовал glDepthFunc(GL_ALWAYS)

Спасибо, попробую.
То есть всё же используются функции gl* ?
« Последнее редактирование: Апрель 30, 2013, 11:27 от spirits25 » Записан
spirits25
Гость
« Ответ #3 : Апрель 30, 2013, 11:27 »

При использовании
Код:
glDepthFunc(GL_ALWAYS);
Всё глючит (картинку прикрепляю).

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

Я думаю мне нужен второй вариант, но при этом указать верхнему слою, чтобы он тоже не исчезал?
Записан
spirits25
Гость
« Ответ #4 : Май 06, 2013, 14:42 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 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) - размеры окна в пыкселях.
Записан
spirits25
Гость
« Ответ #6 : Май 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);
Но всё равно, при изменении задних объектов (при удалении старых и взамен добавлении новых) они не отображаются (наверно, программа всё же остаётся при мнении, что они скрыты и не должны быть отображены).

Спасибо за помощь, буду пытаться ещё.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 07, 2013, 16:45 »

Но всё равно, при изменении задних объектов (при удалении старых и взамен добавлении новых) они не отображаются (наверно, программа всё же остаётся при мнении, что они скрыты и не должны быть отображены).
Про удаление/добавление ничего не знаю - приведенный метод только обеспечивает рисование объектов перекрытых другими/ближайшими
Записан
spirits25
Гость
« Ответ #8 : Май 08, 2013, 11:58 »

Про удаление/добавление ничего не знаю - приведенный метод только обеспечивает рисование объектов перекрытых другими/ближайшими

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

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

Вот так они рисуются независимо. Прошу прощение за продолжительное мозгоделание и ещё раз спасибо за советы=)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.