На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Смешивание цветов, или как с помощью скрещивания двух яблонь получить банановую пальму?
Добрый день. Такой вопрос: имеется некий код, отображающий произвольную кривую посредством TRIANGLES_STRIP, необходимо подсвечивать зоны самопересечения. Варианта два:
1) городить огород и вычислять точки пересечения, добавлять нужные вершины и цвета, ...
2) использовать смешивание цветов.
Проблема в том, что цвет один и glBlendFunc() на выходе дает исходный цвет. Что логично и так должно быть.
Я пока не могу найти адекватного решения данной проблемы. Но, полагаю, что не я первый с этим сталкиваюсь. Если есть опыт или идеи - прошу поделиться. Возможно нужно просто написать хитрей шейдер и будет мне счастье.
glStencilFunc + glStencilOp.
Подпись была включена в связи с окончанием срока наказания
А можно и без стенсила обойтись, альфаканал задействовать.
OpenGL, а можно чуть подробнее? с учетом того, что с openGL я работаю без году неделю.
у меня есть следующий код:
initGL:
ExpandedWrap disabled
        void SnowGlWidget::initializeGL()
        {
            glEnable(GL_DEPTH_TEST);
            glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
            glStencilMask(0x00);
            glStencilFunc(GL_ALWAYS, 1, 0xFF);
            glStencilMask(0xFF);
     
            QGLShader vShader(QGLShader::Vertex);
            if(!vShader.compileSourceCode(
                        "attribute vec3 vertexPosition;\n"
                        "uniform mat4 modelViewProjMatrix;\n"
                        "attribute highp vec4 vertexAttr;\n"
                        "attribute lowp vec4 colorAttr;\n"
                        "varying lowp vec4 color;\n"
                        "void main()\n"
                        "{\n"
                            "color = colorAttr;\n"
                            "gl_Position = modelViewProjMatrix * vec4(vertexPosition, 1.0);\n"
                        "}\n"
                        )) {
                return;
            }
            QGLShader fShader(QGLShader::Fragment);
            if(!fShader.compileSourceCode(
                                      "varying lowp vec4 color;\n"
                                      "void main()\n"
                                      "{\n"
                                         " gl_FragColor = color;\n"
                                      "}\n"
                                          )) {
                QMessageBox::critical(0, tr("ERROR"), fShader.log(),
                                      QMessageBox::Ok);
                return;
            }
     
            if(!m_program.addShader(&vShader)){
                return;
            }
            if(!m_program.addShader(&fShader)){
                return;
            }
            if (!m_program.link()) {
                return;
            }
            if (!m_program.bind()) {
                return;
            }
            m_vertexAttr = m_program.attributeLocation("vertexAttr");
            m_colorAttr = m_program.attributeLocation("colorAttr");
            m_track = new SnowTrack(&m_program, m_vertexAttr, m_colorAttr, m_points);
            m_perspective.aspectRatio = height() > 0.0f ? float(width()) / float(height()) : 1.0f;
        }


paintGL:
ExpandedWrap disabled
    void SnowGlWidget::paintGL()
        {
            qglClearColor(QColor(32,64,128,0));
            glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
            glStencilMask(0x00);
            glStencilFunc(GL_ALWAYS, 1, 0xFF);
            glStencilMask(0xFF);
            m_projectionMat.setToIdentity();
            m_projectionMat.perspective(
                        m_perspective.verticalAngle,
                        m_perspective.aspectRatio,
                        m_perspective.nearPlane,
                        m_perspective.farPlane);
     
            m_viewMat.setToIdentity();
            m_viewMat.lookAt(m_lookAt.eye, m_lookAt.center, m_lookAt.up);
     
            m_modelMat.setToIdentity();
            m_modelMat.scale(m_modelScale);
            m_modelMat.rotate(m_angle,-0.f,0.f,1);
            m_modelMat.translate(m_modelTranslation);
     
            m_program.setUniformValue("normalMatrix", m_modelMat.normalMatrix()); // world normal
            m_program.setUniformValue("modelViewMatrix", m_viewMat * m_modelMat);
            m_program.setUniformValue("projectionMatrix", m_projectionMat);
            m_program.setUniformValue("modelViewProjMatrix", m_projectionMat * m_viewMat * m_modelMat);
     
            m_program.setUniformValue("lightPosition", m_lightPosition);
            m_program.setUniformValue("lightKd", m_lightKd);
            m_program.setUniformValue("lightLd", m_lightLd);
            m_track->draw();
            calculateFps();
        }

формирование вершин и цветов для шейдера
ExpandedWrap disabled
        void SnowTrack::drawTest()
        {
            m_vertices << -0.5f << -0.5f << 0.0f;
            m_vertices << 0.5f << -0.5f << 0.0f;
            m_vertices << 0.0f << 0.5f << 0.0f;
     
            m_vertices << -0.2f << -0.5f << 0.0f;
            m_vertices << 0.8f << -0.5f << 0.0f;
            m_vertices << 0.2f << 0.5f << 0.0f;
     
            m_colors << 0.f << 1.f << 0.f;
            m_colors << 0.f << 1.f << 0.f;
            m_colors << 0.f << 1.f << 0.f;
     
            m_colors << 1.f << 1.f << 0.f;
            m_colors << 1.f << 1.f << 0.f;
            m_colors << 1.f << 1.f << 0.f;
     
        }


ну и собственно отрисовка

ExpandedWrap disabled
            void SnowTrack::draw()
        {
            m_program->enableAttributeArray("vertexPosition");
            m_program->setAttributeArray("vertexPosition", m_vertices.data(), 3);
            m_program->setAttributeArray(m_colorAttr, m_colors.data(), 3);
            m_program->enableAttributeArray(m_colorAttr);
                    glDrawArrays(GL_TRIANGLE_STRIP, 0, m_vertices.size() / 3);
            m_program->disableAttributeArray(m_vertexAttr);
            m_program->disableAttributeArray(m_colorAttr);
        }


и, судя по всему, я все же что-то делаю не так, ибо получаю следующую картинку
Прикреплённая картинка
Прикреплённая картинка


Добавлено
Mikle, наверное можно, только пока не могу понять как. С учетом того, что мне нужно получать заданный цвет и трек у меня одного цвета.
Цитата kotmatroskin55 @
мне нужно получать заданный цвет и трек у меня одного цвета

Тогда лучше стенсил, именно заданный цвет получить сложнее с помощью альфы, можно получить просто контрастный, какой получится.
Mikle
OpenGL, и все же таки, можно пример какой-нить? Для тех, кому сразу непонятен, например этот мануал. Мне бы маленькую зацепочку, а дальше я сам.
Я могу только на Direct3D пример сделать, если поможет.
Сообщение отредактировано: Mikle -
У меня готового примера нет, и когда сделаю - не могу сказать. Идея была в том, чтобы рисовать дважды - первый раз с функцией GL_ALWAYS и операцией GL_INCR (т.е. каждый раз увеличиваешь значение в буфере, там, где нарисуешь больше 1 раза будет значение, большее 1), а второй раз - цветом смешения и функцией GL_NOTEQUAL (т.е. рисуешь там, где не равно 1).
Сообщение отредактировано: OpenGL -
Подпись была включена в связи с окончанием срока наказания
OpenGL
Цитата OpenGL @
У меня готового примера нет, и когда сделаю - не могу сказать.

ну это не страшно, буду курить мануалы, а за идею спасибо.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1103 ]   [ 21 queries used ]   [ Generated: 20.09.19, 21:02 GMT ]