我尝试在QOpenGLWidget中使用QOpenGLWidget(在paintGL中),但是对象不混合(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)
截图

为什么会发生这种情况?
发布于 2018-08-29 06:32:37
如果要实现共混效果,则必须禁用深度测试:
glDisable(GL_DEPTH_TEST);注意,默认的深度测试函数是GL_LESS。如果一个片段是在前一个片段的一个位置上绘制的,那么它就会被深度测试丢弃,因为这个条件不是完全填充的。
如果禁用深度测试,则由混合函数(glBlendFunc)和方程(glBlendEquation)“混合”片段。
我建议使用以下混合功能:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);发布于 2022-02-05 01:19:26
在我的例子中(QT5.15.2),我发现使用没有alpha成分的颜色调用(例如。glColor3f(1,0,0) )导致在任何后续呈现中禁用混合。令我惊讶的是,我甚至无法通过重新发出以下命令来恢复它:
glEnable(GL_BLEND); // wtf has no effect
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);混合只是保持禁用,直到下一个油漆开始。这在原始的QGLWidget类中没有发生。这种情况只发生在QOpenGLWidget上,而且只发生在Windows上(Mac + Linux很好)。
对我来说,最好的解决方案是用alpha等价物替换任何非alpha颜色的调用,至少在以后需要在渲染中使用混合的情况下是这样。例如:
glColor3f(1,0,0); // before
glColor4f(1,0,0,1); // after可能会出现的另一个问题是,如果在直接呈现的同时使用QPainter,因为QPainter会破坏您的OpenGL状态。请参阅文档中提到的“beginNativePainting”:
https://doc.qt.io/qt-5/qopenglwidget.html#painting-techniques
编辑:我会在这里添加这一点,因为我对狂犬病的答案的评论由于某种原因被删除了-深度测试不需要禁用才能使用混合。Rabbid可能会考虑禁用深度缓冲区写入,有时这样做是为了允许绘制所有半透明的对象,而不必按最接近的顺序排序:
https://stackoverflow.com/questions/52061971
复制相似问题