如何使用 alpha 创建 QOffscreenSurface?

How to create QOffscreenSurface with alpha?

找到一个 (更新 1 中有一个工作代码)。

但是无法让它支持alpha,看下面的代码:

    QSurfaceFormat surfaceFormat;
    surfaceFormat.setColorSpace(QSurfaceFormat::ColorSpace::sRGBColorSpace);
    surfaceFormat.setRenderableType(QSurfaceFormat::RenderableType::OpenGL);
    surfaceFormat.setMajorVersion(4);
    surfaceFormat.setMinorVersion(3);
    surfaceFormat.setAlphaBufferSize(8);

    if (surfaceFormat.hasAlpha())
    {
        qInfo() << "The surface has alpha.";
    }
    else
    {
        qInfo() << "The surface does not have alpha.";
    }

它总是打印“表面有 alpha”。但是我的离屏渲染在没有 alpha 的情况下工作,或者更准确地说我得到了一个奇怪的效果,透明像素变成白色而背景是黑色:

与没有透明度的原始图像比较:

片段着色器中的区别是vec4(fragColor, 0.5)vec4(fragColor, 1.0)

program.addShaderFromSourceCode(QOpenGLShader::Fragment,
                               "#version 330\r\n"
                               "in vec3 fragColor;\n"
                               "out vec4 color;\n"
                               "void main() {\n"
                               "    color = vec4(fragColor, 1.0);\n"
                               "}\n"
                               );

我可以设置其他选项吗?

我的环境:Windows10,MSVC 2019,QT 6.2。

编辑 1:

做了一些进一步的实验并在渲染三角形之前添加了以下内容:

        glDisable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquation(GL_FUNC_ADD);
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

得到白色背景:

glClearColor(0, 0, 0, 0.5)我变灰了:

您的图像查看器在白色背景上显示您的图像,因此您看到的是白色或灰色。使用 glClearColor(0, 0, 0, 1) 你会看到一个黑色背景上的透明三角形:

    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBlendEquation(GL_FUNC_ADD);
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

但生成的三角形将部分透明,因此白色图像查看器背景将在三角形下方部分可见。