在QOpenGLWidget

时间:2018-08-28 15:57:04

标签: qt opengl qt5

我正在尝试在glBlendFunc(在paintGL中)中使用QOpenGLWidget,但是对象没有混合(alpha是有效的)。

我的代码:

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)

截图

为什么会这样?

1 个答案:

答案 0 :(得分:0)

如果要实现blending效果,则必须禁用深度测试:

glDisable(GL_DEPTH_TEST);

请注意,默认的深度测试功能为GL_LESS。如果在先前片段的位置上绘制了一个片段,则由于该条件未完全填充,因此深度测试将其丢弃。
如果深度测试被禁用,则片段将通过混合函数(glBlendFunc)和方程式(glBlendEquation)被“混合”。

我建议使用以下混合功能:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);