在 OpenGL 中设置透明背景颜色不起作用

Posted

技术标签:

【中文标题】在 OpenGL 中设置透明背景颜色不起作用【英文标题】:Setting transparent background color in OpenGL doesn't work 【发布时间】:2018-02-08 00:18:41 【问题描述】:

我尝试使用函数 glClearColor() 和 glClear() 将背景颜色设置为透明颜色。但是,传递给 glClearColor() 的 alpha 值根本不会改变任何东西。

这是我尝试运行的代码:

 #include<GL/glut.h>

    void display()
    
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0,(float)glutGet(GLUT_WINDOW_WIDTH),0.0,(float)glutGet(GLUT_WINDOW_HEIGHT));

        glBegin(GL_LINES);
            glVertex2i(200,200);
            glVertex2i(300,305);
        glEnd();

        glFlush();
    

    int main(int argc, char *argv[const])
    
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA);
        glutInitWindowSize(1100,620);
        glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH)-1100)/2,(glutGet(GLUT_SCREEN_HEIGHT)-620)/2);
        glutCreateWindow("GLUT Programming");
        glClearColor(0.0f,0.0f,0.0f,0.5f);   // I have tried experimenting with this part, but, nothing happens
        glutDisplayFunc(display);
        glutMainLoop();
    

如果有帮助,我正在运行 Fedora 26 的机器上使用 freeglut 和 freeglut-devel。

编辑:

我得到的结果:

我试图获得的结果:

【问题讨论】:

我从未见过它工作。您的 glut 实现很有可能不会加点它,这往往不是一个常见的用例。你可能想看看这个:gist.github.com/je-so/903479/… 直接通过 xlib 完成。 你在看什么?你期望看到什么? (这种情况适合发图) 您期待什么结果? alpha 值 != 1 的背景只有在您启用混合并使用需要目标 alpha 值的混合功能时才会产生影响。还是你想让窗口透明? @rioki 链接中提供的代码确实有效。但是,仅使用 OpenGL 就不可能做到这一点吗?另外,只是出于好奇,如何使窗口完全透明,包括标题栏? (windows 有一个实现,但是,对于 linux 呢?) @n.m.包括图片。 【参考方案1】:

如果要启用Blending,则必须启用混合(glEnable( GL_BLEND ))并且必须设置混合功能(glBlendFunc)。 此外,您必须设置用于绘制几何图形的颜色的 Alpha 通道 (glColor4f)

以某种方式更改您的代码:

glClearColor( 0.5f, 0.5f, 0.5f, 1.0f );              // background color
glClear(GL_COLOR_BUFFER_BIT);                        // clear background with background color

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); // = color * alpha + background * (1-alpha)
glColor4f( 1.0f, 0.0f, 0.0f, 0.1f );                 // color of the line, alpha channel 0.1 (very "transparent")
glLineWidth( 5.0 );

glBegin(GL_LINES);
.....

【讨论】:

修改后的代码使线条变得透明。我想对背景做同样的事情。更改代码第一行中的 alpha 值没有任何区别。我想用它来渲染透明背景。 @Enqueue 好的,我明白了。但这不会像那样工作。查看您的问题的 cmets。

以上是关于在 OpenGL 中设置透明背景颜色不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NavigationView 中设置列​​表的背景颜色

如何在 WebKit 中设置选择框背景?

CSS不透明度背景颜色和文本不起作用[重复]

Swift - 在 UITableView 中设置清晰的背景颜色

ios PWA 中的黑色半透明不起作用

具有背景颜色和透明前景图像的 UIButton 自定义类型不起作用