Используйте glBlendFunc в QOpenGLWidget - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь использовать glBlendFunc в QOpenGLWidget (в paintGL), но объекты не смешиваются (альфа работает).

Мой код:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);

glBlendFunc (blenFunc, GL_ONE);

m_world.setToIdentity();
m_world.rotate((m_xRot / 16.0f), 1, 0, 0);
m_world.rotate(m_yRot / 16.0f, 0, 1, 0);
m_world.rotate(m_zRot / 16.0f, 0, 0, 1);

QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
m_program->bind();
m_tex->bind();
fillYoffsetLightning();

const GLfloat scaleFactor = 0.05f;
m_world.scale(scaleFactor, scaleFactor, 0.0f);
m_world.translate(0.f, 0.0f, 0.0f);

const GLfloat fact = 1 / scaleFactor;
const uint8_t X = 0, Y = 1;

for(int i = 0; i < maxElem; ++i) {
    const GLfloat offX = m_ELECT[i][X] * fact;
    const GLfloat offY = m_ELECT[i][Y] * fact;
    m_world.translate(offX, offY);

    m_program->setUniformValue(m_projMatrixLoc, m_proj);
    m_program->setUniformValue(m_mvMatrixLoc, m_camera * m_world);
    QMatrix3x3 normalMatrix = m_world.normalMatrix();
    m_program->setUniformValue(m_normalMatrixLoc, normalMatrix);

glDrawArrays (GL_TRIANGLE_FAN, 0, m_logo.vertexCount ());

    update();
    m_world.translate(-offX, -offY);
}

m_program->release();

шейдеры просты:

// vertex
"attribute highp vec4 color;\n"
"varying highp vec4 colorVertex;\n"
//......... main:
"colorVertex = color;\n"

// fragment
"varying highp vec4 colorVertex;\n"
//......... main:
"gl_FragColor = colorVertex;\n"

Цвет: рисуется пятиугольник с градиентом от белого к центру от белого к краю (центральный цвет - 1,1,1, ребра - 0,0,0,5)

screenshoot

Почему это происходит?

1 Ответ

0 голосов
/ 29 августа 2018

Если вы хотите добиться эффекта blending , вам нужно отключить тест глубины:

glDisable(GL_DEPTH_TEST);

Обратите внимание, что функция проверки глубины по умолчанию: GL_LESS. Если фрагмент рисуется на месте предыдущего фрагмента, то он отбрасывается тестом глубины, потому что это условие не заполнено полностью.
Если проверка глубины отключена, то фрагменты «смешиваются» с помощью функции смешивания (glBlendFunc) и уравнения (glBlendEquation).

Я рекомендую использовать следующую функцию смешивания:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...