QGLWidget中的Transparent Shader导致透明背景(透视)
Transparent Shader in QGLWidget leads to transparent background (see through)
我有一个 QGLWidget:
GlWidget::GlWidget(QWidget *parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
为了抗锯齿,我最近实施了 Samplebuffer
。
对于一些透明网格,我使用了 GL_BLEND
函数:
void GlWidget::initializeGL()
{
...
glEnable(GL_MULTISAMPLE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我的小部件也有在 painGL()
函数中绘制的背景:
void GlWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glColor4f(0.67,0.67,0.75,1);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glColor4f(0.2,0.2,0.2,1);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
// other object drawing stuff
...
}
我遇到的问题是 windows 在渲染透明网格的地方变得透明。
我想要 BLEND
应用于我绘制的彩色背景。
我试图在绘制之前用 none 透明白色清除小部件,但这没有帮助。
更多解释请看这张图片:http://i.stack.imgur.com/AZx3f.png
在我实现SampleBuffers之前没有出现这个问题。
我搜索了几个小时,简单的解决方案是:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我有一个 QGLWidget:
GlWidget::GlWidget(QWidget *parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
为了抗锯齿,我最近实施了 Samplebuffer
。
对于一些透明网格,我使用了 GL_BLEND
函数:
void GlWidget::initializeGL()
{
...
glEnable(GL_MULTISAMPLE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我的小部件也有在 painGL()
函数中绘制的背景:
void GlWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glColor4f(0.67,0.67,0.75,1);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glColor4f(0.2,0.2,0.2,1);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
// other object drawing stuff
...
}
我遇到的问题是 windows 在渲染透明网格的地方变得透明。
我想要 BLEND
应用于我绘制的彩色背景。
我试图在绘制之前用 none 透明白色清除小部件,但这没有帮助。
更多解释请看这张图片:http://i.stack.imgur.com/AZx3f.png
在我实现SampleBuffers之前没有出现这个问题。
我搜索了几个小时,简单的解决方案是:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);