我正在尝试在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)
截图
为什么会这样?
答案 0 :(得分:0)
如果要实现blending效果,则必须禁用深度测试:
glDisable(GL_DEPTH_TEST);
请注意,默认的深度测试功能为GL_LESS
。如果在先前片段的位置上绘制了一个片段,则由于该条件未完全填充,因此深度测试将其丢弃。
如果深度测试被禁用,则片段将通过混合函数(glBlendFunc
)和方程式(glBlendEquation
)被“混合”。
我建议使用以下混合功能:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);