首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在glBlendFunc中使用QOpenGLWidget

在glBlendFunc中使用QOpenGLWidget
EN

Stack Overflow用户
提问于 2018-08-28 15:57:03
回答 2查看 292关注 0票数 1

我尝试在QOpenGLWidget中使用QOpenGLWidget(在paintGL中),但是对象不混合(alpha是工作的)。

我的代码:

代码语言:javascript
复制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);

glBlendFunc(blenFunc,GL_ONE);

代码语言:javascript
复制
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());

代码语言:javascript
复制
    update();
    m_world.translate(-offX, -offY);
}

m_program->release();

着色器很简单:

代码语言:javascript
复制
// 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)

截图

为什么会发生这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 06:32:37

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

代码语言:javascript
复制
glDisable(GL_DEPTH_TEST);

注意,默认的深度测试函数是GL_LESS。如果一个片段是在前一个片段的一个位置上绘制的,那么它就会被深度测试丢弃,因为这个条件不是完全填充的。

如果禁用深度测试,则由混合函数(glBlendFunc)和方程(glBlendEquation)“混合”片段。

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

代码语言:javascript
复制
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
票数 0
EN

Stack Overflow用户

发布于 2022-02-05 01:19:26

在我的例子中(QT5.15.2),我发现使用没有alpha成分的颜色调用(例如。glColor3f(1,0,0) )导致在任何后续呈现中禁用混合。令我惊讶的是,我甚至无法通过重新发出以下命令来恢复它:

代码语言:javascript
复制
glEnable(GL_BLEND); // wtf has no effect
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

混合只是保持禁用,直到下一个油漆开始。这在原始的QGLWidget类中没有发生。这种情况只发生在QOpenGLWidget上,而且只发生在Windows上(Mac + Linux很好)。

对我来说,最好的解决方案是用alpha等价物替换任何非alpha颜色的调用,至少在以后需要在渲染中使用混合的情况下是这样。例如:

代码语言:javascript
复制
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可能会考虑禁用深度缓冲区写入,有时这样做是为了允许绘制所有半透明的对象,而不必按最接近的顺序排序:

为什么我们在混合中禁用Z-写

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52061971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档