如何使用 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);
但生成的三角形将部分透明,因此白色图像查看器背景将在三角形下方部分可见。
找到一个
但是无法让它支持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);
但生成的三角形将部分透明,因此白色图像查看器背景将在三角形下方部分可见。