gpt4 book ai didi

qt - 在 QGLFramebufferObject 上渲染时错误的 alpha 混合

转载 作者:行者123 更新时间:2023-12-04 21:47:20 25 4
gpt4 key购买 nike

我为我的应用程序编写了一个基于 OpenGL 的矢量图形渲染器。它需要渲染到帧缓冲对象而不是直接渲染到屏幕。由于我在 Qt 中编写应用程序,因此我使用了 QGLFramebufferObject,它是 OpenGL 帧缓冲区对象的包装类。

我创建了一个最小的示例,它显示了在渲染更复杂的东西时我也得到的错误结果(例如,使用片段着色器将颜色设置为非 alpha 值)。我只是在黑色清除屏幕上渲染了一个红色圆圈和一个半透明的绿色圆圈,然后在 FBO 上也是如此:

void MainWidget::initializeGL()
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0, 0, 0, 0);
}

void MainWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}

void MainWidget::paintGL()
{
// DRAW ON THE SCREEN
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(100);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor4f(1, 0, 0, 1);
glVertex2f(-.2, 0);
glColor4f(0, 1, 0, .5);
glVertex2f( .2, 0);
glEnd();
}

QGLFramebufferObject fbo(width(), height());
fbo.bind();

// DRAW ON THE FBO USING THE SAME CODE AND THE SAME CONTEXT
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(100);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor4f(1, 0, 0, 1);
glVertex2f(-.2, 0);
glColor4f(0, 1, 0, .5);
glVertex2f( .2, 0);
glEnd();
}

fbo.release();
fbo.toImage().save("debug.png");
}

结果在屏幕上看起来像这样(缩放 400%):

enter image description here

渲染到 QGLFramebufferObject 看起来像这样(也缩放了 400%):

enter image description here

请注意,此图像并非完全不透明,因此这里是在其后面添加了棋盘格的相同图像:

enter image description here

甚至两个圆圈重叠的区域也不是完全不透明的。而且抗锯齿看起来很丑。

这是怎么发生的?我该如何解决这个问题?

我已经尝试过:
  • 不同的混合功能。
  • 显式禁用 QGLFramebufferObject 上的深度缓冲区、模板缓冲区和采样。我不确定 QGLFramebufferObject 默认格式是否添加了我不想要的东西。
  • 最佳答案

    请尝试以下操作:

    QGLFramebufferObjectFormat fmt;
    fmt.setSamples(1); // or 4 or disable this line
    fmt.setInternalTextureFormat(GL_RGBA8);
    QGLFramebufferObject fbo(width(), height(), fmt);

    这会强制使用特定的像素格式,并且还会通过使用多重采样禁用渲染到纹理(否则 QT 总是渲染到纹理)。那可能会产生不同的结果。您还可以尝试使用该格式。

    另外,你的硬件是什么?我的最大点大小仅为 64 像素(GTX 260),您正在尝试渲染 100 像素点。那可能是个问题。是否生成了任何 OpenGL 错误?在小点上也会发生同样的情况吗?

    您也可以尝试提示(如果在 QT 中可能):
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

    但我不希望这会改变任何事情。

    关于qt - 在 QGLFramebufferObject 上渲染时错误的 alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12306894/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com