es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear una superficie fuera de pantalla QOffscreenSurface con transparencia alfa?

Encontré un ejemplo de renderizado fuera de pantalla en QT (hay un código funcional en la actualización 1).

Pero no pude hacer que soporte alpha, vea el código a continuación:

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() << "La superficie tiene alpha.";
}
else
{
    qInfo() << "La superficie no tiene alpha.";
}

siempre imprime “La superficie tiene alpha.” pero mi renderizado fuera de pantalla funciona sin alpha o hablando más exactamente, estoy obteniendo un efecto extraño, los píxeles transparentes se vuelven blancos mientras que el fondo es negro.

compararlo con la imagen original sin transparencia:

la diferencia está en vec4 (fragColor, 0.5) y vec4 (fragColor, 1.0) en el fragment shader:

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”
);

¿Hay alguna otra opción que pueda establecer?

Mi entorno: Windows 10, MSVC 2019, QT 6.2.

EDIT1:

Hice algunas experimentaciones adicionales y agregué lo siguiente antes de renderizar el triángulo:

    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);

y obtuve un fondo blanco:

con glClearColor(0,0,0,0.5) obtuve gris.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con la representación fuera de pantalla en QT y el soporte para canales alfa no es infrecuente. En el ejemplo proporcionado, el código establece el tamaño del buffer alfa en 8, pero no parece proporcionar el resultado deseado.

    En el sombreador de fragmentos, el valor de vec4 (fragColor, 0.5) produce un efecto transparente, pero se vuelve blanco en la imagen final. Esto sugiere que el canal alfa no está configurado correctamente.

    Después de una experimentación más detallada, la función glBlendFunc() puede usarse para especificar las ecuaciones de fusión para los valores RGB y alfa. Al establecer la función de fusión en glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), se puede admitir adecuadamente la transparencia.

    Además de esto, el color de limpieza se puede establecer en (0, 0, 0, 0) para garantizar que el canal alfa se borre correctamente antes de la representación. Al hacer esto, se pueden lograr los efectos de transparencia y mezcla de alfa adecuados en la representación fuera de pantalla.

    Es importante tener en cuenta que este problema puede no estar limitado al código proporcionado y puede requerir una investigación y experimentación adicionales para implementar adecuadamente el soporte para canales alfa en la representación fuera de pantalla de QT.

Comments are closed.