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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Регулирование прозрачности объекта  (Прочитано 14259 раз)
spirits25
Гость
« Ответ #15 : Май 17, 2013, 12:19 »

Это все на момент рисования (а не создания) причем важен порядок отрисовки. Напр если Вы перенесете код рисования белого квадрата после рисования куба - эффект исчезнет. Геометрию и текстуры заряжаете как обычно. Шейдер имеет право делать что хочет, поэтому оключать его не то чтобы "обязательно", а для "чистоты эксперимента"

Я отрисовываю так:
Код:
    backNode->draw(painter);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GLfloat color[4] = { 1, 1, 1, 0.2};
    glColor4fv(color);
   
    frontNode->draw(painter);
   
    glDisable(GL_BLEND);
при этом ничего не меняется. backNode и frontNode - готовые к отображению объекты QGLSceneNode, поэтому на данном этапе я не могу сделать
Код:
    program->setAttributeArray
        (PROGRAM_VERTEX_ATTRIBUTE, vertices.constData());
    program->setAttributeArray
        (PROGRAM_TEXCOORD_ATTRIBUTE, texCoords.constData());
, так как vertices и texCoords у меня были в момент создания объектов и после метода QGLBuilder::finalizedSceneNode() они больше не нужны.
Записан
Disa
Гость
« Ответ #16 : Май 17, 2013, 13:18 »

Домой вечером доберусь, постараюсь накидать рабочий код
Записан
spirits25
Гость
« Ответ #17 : Июнь 03, 2013, 15:51 »

Домой вечером доберусь, постараюсь накидать рабочий код
Жду помощи=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Июнь 03, 2013, 16:24 »

Я отрисовываю так:
Код:
    backNode->draw(painter);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GLfloat color[4] = { 1, 1, 1, 0.2};
    glColor4fv(color);
    
    frontNode->draw(painter);
    
    glDisable(GL_BLEND);
при этом ничего не меняется. backNode и frontNode - готовые к отображению объекты QGLSceneNode, поэтому на данном этапе я не могу сделать
Код:
    program->setAttributeArray
        (PROGRAM_VERTEX_ATTRIBUTE, vertices.constData());
    program->setAttributeArray
        (PROGRAM_TEXCOORD_ATTRIBUTE, texCoords.constData());
, так как vertices и texCoords у меня были в момент создания объектов и после метода QGLBuilder::finalizedSceneNode() они больше не нужны.
Мне в принципе нечего добавить. Если в примере работает а у Вас нет, значит что-то мешает. Попробуйте на простых объектах - напр 2 прямоугольника, один далеко, др близко. Убедитесь что выставленные glColor и glBlend не перекрываются в frontNode->draw(painter). Да, ну и менять ATTRIBUTE конечно не нужно
Записан
spirits25
Гость
« Ответ #19 : Июнь 03, 2013, 16:31 »

Мне в принципе нечего добавить. Если в примере работает а у Вас нет, значит что-то мешает. Попробуйте на простых объектах - напр 2 прямоугольника, один далеко, др близко. Убедитесь что выставленные glColor и glBlend не перекрываются в frontNode->draw(painter). Да, ну и менять ATTRIBUTE конечно не нужно
дело в том, что у меня объекты QGLSceneNode и отрисовываются они по другому. Или это не должно влиять, схема одна должна быть?
Записан
spirits25
Гость
« Ответ #20 : Июнь 03, 2013, 16:49 »

А для того стандартного примера qtbase/examples/opengl/textures прозрачность работает лишь при добавлении
Код:
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GLfloat color[4] = { 1, 1, 1, 0.23 };
    glColor4fv(color);
Всё остальное Вы добавляли для наглядности, как я понял. Видимо всё таки чего-то я в упор не вижу=)
Записан
spirits25
Гость
« Ответ #21 : Июнь 04, 2013, 11:31 »

Решил, подсмотрев тут http://gitorious.org/qt-quick3d/qt-quick3d/blobs/9dd2f1b8a26f054ed61ff9151e226213fa1ebc94/src/plugins/sceneformats/obj/qglobjscenehandler.cpp , а именно с 416 строки идёт следующее:
Код:
        } else if (keyword == "d") {
            // "Dissolve factor" of the material, which is its opacity.
            if (material) {
                qreal alpha = objReadFloat(line, &posn);
                QColor ambient = material->ambientColor();
                QColor diffuse = material->diffuseColor();
                ambient.setAlphaF(alpha);
                diffuse.setAlphaF(alpha);
                material->setAmbientColor(ambient);
                material->setDiffuseColor(diffuse);
            }

Всем спасибо за помощь, особенно Igors! Надеюсь кому-нибудь эта тема сбережёт время=)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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