OpenFrameworks中的透明背景窗口

Transparent background window in OpenFrameworks

本文关键字:背景 窗口 透明 OpenFrameworks      更新时间:2023-10-16

我正在尝试创建一个捕捉触摸事件的不可见覆盖(它将负责使用oscpack发送数据包)。因此,我需要创建一个透明的全屏窗口。(编辑:如果交叉兼容性有问题,win32就可以了)

在官方文档中,ofBackground似乎接受alpha混合,但当我编写ofBackground(0, 255, 0, 10);并运行项目时,窗口是不透明的。我也尝试过使用ofEnableAlphaBlending();,但结果是一样的。(我认为它只允许新绘制的东西进行阿尔法混合)

我试着挖掘更多,我在这个方法中发现了一个小评论:

ofAppGlutWindow::setupOpenGL(int w, int h, int screenMode)
{
//code
}
/*
    ofBackground(200,200,200);      // default bg color
            ofSetColor(0xFFFFFF);           // default draw color
            // used to be black, but
            // black + texture = black
            // so maybe grey bg
            // and "white" fg color
            // as default works the best...
            */

这并没有像我最初想的那样帮助我,我仍然被卡住了。

您不能直接使用openFrameworks来实现这一点。您需要创建一个具有透明背景的OpenGL上下文。这很难做到,我不知道你是否可以将它与oF集成,但你可以测试一下。

然而,如果你在OSX上,有这个插件:ofxTransparentWindow

一个肮脏的技巧是抓取你的桌面图像,并将其作为背景放在你的应用程序中。

截至2023年3月!现在,对于Windows、macOS和Linux,您可以使用以下设置在GLFW openFrameworks中启用透明度。

ofGLFWWindowSettings settings;
settings.transparent = true;

因此,以下将是main.cpp的示例:

int main( ){
//Use ofGLFWWindowSettings for more options like multi-monitor fullscreen
ofGLFWWindowSettings settings;
settings.setSize(1024, 768);
settings.windowMode = OF_WINDOW; //can also be OF_FULLSCREEN
settings.glVersionMajor = 3.0;
settings.glVersionMinor = 3.0;
settings.transparent = true;
auto window = ofCreateWindow(settings);
ofRunApp(window, make_shared<ofApp>());
ofRunMainLoop();
}

然后,您所需要做的就是通过clear方法清除每帧的后缓冲区。

ofClear(0.0f, 0.0f, 0.0f, 0.0f);

所以在App::draw()的一个例子中,在开始时清除缓冲区

void ofApp::draw(){
     ofClear(0.0f, 0.0f, 0.0f, 0.0f);
    // other draw code after clear 
}

从技术上讲,这是通过GLFW提示-GLFW_TRANSPARENT_FRAMEBUFFER实现的,该提示现在使用settings.TRANSPARENT作为其值。